我在制定一个有用的策略来支持NSOperationQueue
课堂背景时遇到了一些问题。特别是,我有一堆NSOperation
s 执行以下操作:
- 从网络下载文件
- 解析文件
- 在 Core Data 中导入数据文件
这些操作被插入到串行队列中。一旦一个操作完成,下一个就可以开始了。
当应用程序进入后台时,我需要停止(或继续)操作。从这些讨论(AFNetworking 有后台支持吗?和NSOperations 队列和处理应用程序退出)我看到最好的方法是取消操作并isCancelled
在每个操作中使用属性。然后,根据该属性检查操作的关键点,它允许在应用程序进入后台时回滚(正在运行的操作的)执行状态。
基于突出背景支持的 Apple 模板,我该如何管理类似情况?我可以简单地取消操作或等待当前操作完成吗?详情见评论。
- (void)applicationDidEnterBackground:(UIApplication *)application
{
bgTask = [application beginBackgroundTaskWithExpirationHandler:^{
// Do I have to call -cancelAllOperations or
// -waitUntilAllOperationsAreFinished or both?
[application endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}];
// Start the long-running task and return immediately.
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// What about here?
[application endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
});
}
先感谢您。
编辑
如果NSOperation
main
方法执行下面的代码,如何遵循响应取消事件模式?
- (void)main
{
// 1- download
// 2- parse
// 2.1 read file location
// 2.2 load into memory
// 3- import
// 3.1 fetch core data request
// 3.2 if data is not present, insert it (or update)
// 3.3 save data into persistent store coordinator
}
我描述的每种方法都包含各种步骤(非原子操作,下载操作除外)。因此,在每个步骤中都可能发生取消(以未预定义的方式)。我可以isCancelled
在每一步之前检查财产吗?这行得通吗?
编辑 2 基于 Tammo Freese 的编辑
我明白你的编辑代码是什么意思。但我担心的是以下几点。取消请求(用户可以按下主页按钮)可以在main
执行过程中的任何时候发生,因此,如果我只是返回,操作的状态将被破坏。我需要在返回之前清理它的状态吗?你怎么看?
当我使用同步操作(在它们运行的同一线程中以同步方式执行的操作)时,我描述的问题可能会发生。例如,如果main
正在下载文件(通过 执行下载+sendSynchronousRequest:returningResponse:error
)并且应用程序处于后台,会发生什么情况?如何处理这样的情况?
// download
if ([self isCancelled])
return;
// downloading here <-- here the app is put in background
显然,我认为当应用程序被置于前台时,该操作会再次运行,因为它已被取消。换句话说,它被迫不保持其状态。我错了吗?