如何在内部有多个块的情况下正确执行performFetchWithCompletionHandler

时间:2015-10-22 23:51:34

标签: objective-c

我使用后台获取方法performFetchWithCompletionHandler来更新一些用户数据。但是,这些过程相当复杂并且包含块语句,因此它们不能同步执行。

我担心的是我总是回来completionHandler(UIBackgroundFetchResultNewData);

-(void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
    NSLog(@"Start background data fetch");

    // Update data -- this method contains various blocks inside
    [GETDataRequest updateUserDataWithUser: user];

    // Update images -- this method contains various blocks inside
    [GETImagesRequest updateUserImagesWithUser: user];

    NSLog(@"Background Data Fetch completed");
    completionHandler(UIBackgroundFetchResultNewData);
}

根据this post,关于completionHandler(UIBackgroundFetchResultNewData),提到了以下内容:

  

你必须调用它来让iOS知道你的后台获取结果是什么。它使用此信息来安排将来的后台提取。如果忽略这样做,操作系统可能会延迟将来的后台提取。不调用此处理程序的后果可能包括完全终止您的应用程序。

正如你在这里看到的那样,我总是说它是否成功,无论它是否真的如此。回答者有这个说明我的情况:

  

...只有当你的fetch实际完成时才应该调用完成处理程序。否则iOS可能会在连接完成之前让您的应用程序重新进入休眠状态,并且应用程序实际上无法确定UIBackgroundFetchResultNewData与UIBackgroundFetchResultNoData或UIBackgroundFetchResultFailed,直到那时为止。你怎么知道你的联系会成功?

我所做的实际上是一个问题吗?它真的会切断更新吗?如果它会产生意想不到的结果,那么这个混乱的解决方案是什么?我提到的问题的答案对我来说不够清楚。我已经尝试使用块变量使其正常运行,但一直没有成功。非常感谢。

1 个答案:

答案 0 :(得分:0)

您正在使用的代码用于后台提取刷新功能,通过此功能,您可以在后台通过提及系统时间间隔最小化来快速刷新应用程序。委托方法performFetchWithCompletionHandler中提供了此服务,它将持续30秒。您需要相应地管理您的代码以获得更新的结果,然后根据您的结果,您需要调用适当的完成处理程序块。 如果你有长时间运行的后台任务,我宁愿使用NSURLSessions来使用后台获取服务。