在我的应用中,我正在执行后台提取。
在AppDelegate:didFinishLaunchingWithOptions
方法中,我正在加载一个类:
UIStoryboard *storyb = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];
_syncController = [storyb instantiateViewControllerWithIdentifier:@"SyncStatusViewController"];
并在
-(void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
[HHCServerCall callServerWithFunction:@"xxx" withMethod:@"POST" headers:nil andParameters:bodyPArams success:^(BOOL success, id response) {
NSError *parseError = nil;
NSString *xmlString = [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding];
NSDictionary *xmlDictionary = [XMLReader dictionaryForXMLString:xmlString error:&parseError];
int cntCountRecieved = /...;
if (cntCountRecieved > 0) {
[self.syncController startDownload];
completionHandler(UIBackgroundFetchResultNewData);
}else{
completionHandler(UIBackgroundFetchResultNoData);
}
} failure:^(NSError *error, NSInteger statusCode) {
NSLog(@"failure config call %@",error);
}];
}
_syncController中的startDOwnload方法是NSURLSessionDownloadTask
,
委托方法在同步控制器类中接收数据:
- (void)URLSession:(NSURLSession *)session
downloadTask:(NSURLSessionDownloadTask *)downloadTask
didFinishDownloadingToURL:(NSURL *)location{
//process data
[self updateContactsLabel:processedCount];
}
-(void)updateContactsLabel:(int)count{
dispatch_async(dispatch_get_main_queue(), ^{
int totalContactCount = (int)[[NSUserDefaults standardUserDefaults]integerForKey:@"totalContacts"];
float tmp = (float)count;
if (self.contactsProgressView.hidden) {
self.contactsProgressView.hidden = NO;
}
self.contactsProgressView.progress = tmp/totalContactCount;
self.contactsReceived.text = [NSString stringWithFormat:@"%d",count];
});
}
计数值正如预期的那样正确递增,但是即使在我去那个特定的类之后,这个方法中的所有UIElements都是nil。
我不明白的是,当我真正进入同步类时,我可以看到屏幕上加载了所有元素,并且我看到updateContactsLabel
:被正确调用,并且在该方法中,UIElements为零,即使我去那个班级。
在SyncController类的viewWillAppear中调试时,这些UIElements不是nil,但在updateContactsLabel:方法中它们是nil,它存在于同一个SyncController类中,在下载完成之前会一直调用它。
是因为updateContacts
:方法是在syncController类上调用的,其中尚未加载UIElements?
如何正确更新UIElements?
答案 0 :(得分:0)
当我在初始后台提取期间使用我在APPDelegate上创建的实例替换syncController实例时,这很有效。
我在标签栏控制器viewDidLoad中执行了此操作:
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
_syncController = appDelegate.syncController;
syncNAv = [syncNAv initWithRootViewController:_syncController];
[vcArr removeLastObject];
[vcArr addObject:syncNAv];
[self setViewControllers:[vcArr copy]];
然后值按预期正确更新。