मुझे अपडेट यूआई पता है जब एप्पल द्वारा ऐप में विशेष रूप से ओपनजीएल के लिए ऐप की सिफारिश नहीं की जाती है।ऐप दर्ज करने से पहले यूआई अपडेट तैयार करने के लिए
हालांकि मुझे अभी एहसास हुआ कि मैसेन्जर और फेसबुक का मैसेंजर ऐसा करने में सक्षम दिखता है। अपने मित्र के साथ एक संदेश धागा दर्ज करें और फिर पृष्ठभूमि पर जाएं, फिर ऐप पृष्ठभूमि में रहते हुए एक नया संदेश प्राप्त करें, फिर इस ऐप को अग्रभूमि में लाएं (पुश अधिसूचना या ऐप आइकन पर क्लिक करें), आपको नया संदेश बबल पहले से ही मिल जाएगा आइकन से ऐप विस्तार एनीमेशन के साथ।
मेरी समझ के लिए, यह केवल इसलिए हो सकता है क्योंकि नया संदेश बबल पृष्ठभूमि मोड में पहले ही खींचा गया है। फिर ऐप अग्रभूमि में प्रवेश करते समय, यह एनीमेशन में दिखाई दे सकता है।
हालांकि मेरे परीक्षण परिणाम से, आईओएस 8 और आईओएस 9 में, ऐप सक्रिय होने के बाद सभी पृष्ठभूमि यूआई अपडेट स्थगित कर दिए जाएंगे। और भी, आईओएस उस यूआई अपडेट के लिए एक निहित एनीमेशन लेनदेन जोड़ देगा।
मैंने नीचे अपना टेस्ट कोड सूचीबद्ध किया है, तो आप देखेंगे कि नया सेल एक स्पष्ट एनीमेशन लेनदेन के साथ तालिका में जोड़ा जाएगा जब ऐप अग्रभूमि जा रहा है, पूरी तरह से iMessenger के विपरीत। तालिका दृश्य: संख्या OfRowsInSection: ऐप केवल अग्रभूमि में प्रवेश करते समय निष्पादित विलंब होगा।
और न केवल टेबलव्यू सेल अपडेट के लिए, पृष्ठभूमि में एक सबव्यू जोड़ना भी अग्रभूमि में प्रवेश के लिए समान देरी लेनदेन को ट्रिगर करेगा।
शायद मैं इस बारे में पूरी तरह से गलत दिशा में हूं। क्या कोई मुझे यह समझने में मदद कर सकता है कि iMessenger और FB के मैसेंजर इस प्रभाव को कैसे प्राप्त कर सकते हैं? अग्रिम धन्यवाद!
@interface ViewController() <UITableViewDataSource, UITableViewDelegate>
@property (nonatomic) UITableView *tableView;
@property (nonatomic) NSMutableArray *dataTable;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.tableView = [[UITableView alloc] initWithFrame:self.view.bounds];
[self.view addSubview:self.tableView];
self.tableView.delegate = self;
self.tableView.dataSource = self;
[self.tableView registerClass:[UITableViewCell class]
forCellReuseIdentifier:@"kCellId"];
self.dataTable = [[NSMutableArray alloc] initWithArray:@[@"1", @"2", @"3"]];
__weak __typeof(self) weakSelf = self;
[[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidEnterBackgroundNotification
object:nil
queue:[NSOperationQueue mainQueue]
usingBlock:^(NSNotification * _Nonnull note) {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)),
dispatch_get_main_queue(), ^{
[weakSelf.dataTable addObject:[@(weakSelf.dataTable.count + 1) stringValue]];
[weakSelf.tableView reloadData];
});
}];
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return self.dataTable.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"kCellId"];
cell.textLabel.text = self.dataTable[indexPath.row];
return cell;
}
@end
तुम क्यों प्रयोग कर रहे हैं 'dispatch_after' में एप्लिकेशन जाग करने की अनुमति? यह एक बार लूप का इंतजार करने और बाद में ब्लॉक निष्पादित करने के लिए मजबूर करता है - स्क्रीन को एक बार पहले ही खींचा जा चुका है। NSNotificationCenter वास्तव में * हमेशा * मुख्य थ्रेड में अपने पर्यवेक्षकों को बुलाता है। इसका मतलब है कि आपको जीसीडी का उपयोग करने की ज़रूरत नहीं है। 'Dispatch_after' कॉल को हटाने का प्रयास करें। – Farthen
dispatch_after का उपयोग करके पृष्ठभूमि में ऐप को अपडेट करने के लिए यूआई को अपडेट करने का प्रयास किया जाता है। पृष्ठभूमि अधिसूचना दर्ज करने के बाद सीधे यूआई अपडेट को कॉल करें, यह गारंटी नहीं दे सकता कि कोर एनीमेशन पहले ही बंद हो चुका है। – Pei
मैं इस तरह के एक परीक्षण मामले हार्डकोड करने की सलाह नहीं दूंगा। यदि आप एक बेहतर परीक्षण चाहते हैं, तो मैं कुछ मनमानी डेटा के साथ आपके ऐप पर पुश अधिसूचना भेजूंगा। जब ऐप पुश अधिसूचना प्राप्त करता है, तो पुश अधिसूचना से प्राप्त डेटा के साथ डेटाटेबल अपडेट करें। –