iOS - 后台获取和线程

时间:2015-04-25 09:48:59

标签: ios background-process

我有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代码,因此传递处理程序作为变量不是一个选项。

1 个答案:

答案 0 :(得分:1)

如果委托已设置并且响应,则将完成处理程序传递给它,以便它可以完成其工作并在完成时调用完成处理程序。如果委托未设置或未响应,则直接调用完成处理程序。