我使用后台获取方法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,直到那时为止。你怎么知道你的联系会成功?
我所做的实际上是一个问题吗?它真的会切断更新吗?如果它会产生意想不到的结果,那么这个混乱的解决方案是什么?我提到的问题的答案对我来说不够清楚。我已经尝试使用块变量使其正常运行,但一直没有成功。非常感谢。
答案 0 :(得分:0)
您正在使用的代码用于后台提取刷新功能,通过此功能,您可以在后台通过提及系统时间间隔最小化来快速刷新应用程序。委托方法performFetchWithCompletionHandler中提供了此服务,它将持续30秒。您需要相应地管理您的代码以获得更新的结果,然后根据您的结果,您需要调用适当的完成处理程序块。 如果你有长时间运行的后台任务,我宁愿使用NSURLSessions来使用后台获取服务。