我有app,在其中使用后台获取和更新位置。它可以正常使用此代码:
-(void)backgroundDidUpdateLocations:(NSArray *)locations
{
UIApplication *app = [UIApplication sharedApplication];
__block UIBackgroundTaskIdentifier locationUpdateTaskID = [app beginBackgroundTaskWithExpirationHandler:
^{
dispatch_async(dispatch_get_main_queue(),
^{
if (locationUpdateTaskID != UIBackgroundTaskInvalid)
{
if (_backgroundFetchCompletionHandler != nil)
{
NSLog(@"BG location finished 1");
_backgroundFetchCompletionHandler(UIBackgroundFetchResultNewData);
_backgroundFetchCompletionHandler = nil;
}
[app endBackgroundTask:locationUpdateTaskID];
locationUpdateTaskID = UIBackgroundTaskInvalid;
}
});
}];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),
^{
if (_delegate && [_delegate respondsToSelector:@selector(myLocationManager:didUpdateLocations:)])
{
[_delegate myLocationManager:self didUpdateLocations:locations];
}
dispatch_async(dispatch_get_main_queue(),
^{
if (locationUpdateTaskID != UIBackgroundTaskInvalid)
{
if (_backgroundFetchCompletionHandler != nil)
{
NSLog(@"BG location finished 2");
_backgroundFetchCompletionHandler(UIBackgroundFetchResultNewData);
_backgroundFetchCompletionHandler = nil;
}
[app endBackgroundTask:locationUpdateTaskID];
locationUpdateTaskID = UIBackgroundTaskInvalid;
}
});
});
}
但这有一个问题:
[_delegate myLocationManager:self didUpdateLocations:locations];
如果我使用一些简单的电话,那很好。但是如果_delegate
方法运行另一个后台操作,比如从互联网下载数据,我就有问题了。下载以异步方式启动,因此在传送数据之前,我的后台提取已与backgroundFetchCompletionHandler
“关闭”。数据不在此范围之外传递,我担心,它可能会导致一些问题。如何正确解决这个问题?
修改
我无法修改_delegate
代码,因此传递处理程序作为变量不是一个选项。
答案 0 :(得分:1)
如果委托已设置并且响应,则将完成处理程序传递给它,以便它可以完成其工作并在完成时调用完成处理程序。如果委托未设置或未响应,则直接调用完成处理程序。