如何为appDidEnterBackground扩展具有依赖关系的NSOperationQueue?

时间:2012-07-30 19:38:30

标签: ios objective-c cocoa-touch multitasking nsoperationqueue

我知道如何在iOS应用程序进入后台

后扩展在后台运行的任务
beginBackgroundTaskWithExpirationHandler
dispatch_async

但是,如果我有一个NSOperationQueue,我想扩展为后台任务,而不会失去NSOperations的相互依赖性呢?说我有这个:

NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
    // Do stuff
}];

NSBlockOperation *op2a = [NSBlockOperation blockOperationWithBlock:^{
    // Do stuff
}];
[op2a addDependency:op1];

NSBlockOperation *op2b = [NSBlockOperation blockOperationWithBlock:^{
    // Do stuff
}];
[op2b addDependency:op1];

NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{
    // Do stuff
}];
[op3 addDependency:op2a];
[op3 addDependency:op2b];

NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue addOperations: @[op1, op2a, op2b, op3] ];

是否有一种优雅的方式让NSOperationQueue在后台完成?

1 个答案:

答案 0 :(得分:1)

我意识到我并不完全理解后台线程扩展是如何工作的。

在调用beginBackgroundTaskWithExpirationHandler启动后台扩展后,我可以在后台执行任何操作。我认为只有一个线程被扩展,但事实上整个应用程序一直在运行。

因此,我必须在最后一次NSOperation结束时调用endBackgroundTask来实现我想要的目标。