在后台抓取期间iOS更新UI

时间:2018-04-10 15:28:46

标签: ios user-interface background-process

在我的应用中,我正在执行后台提取。

在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?

1 个答案:

答案 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]];

然后值按预期正确更新。