iphone - 我应该使用NSOperationQueue和NSOperation而不是NSThread吗?

Jac*_*ale 7 iphone objective-c nsoperation nsthread nsoperationqueue

我正面临着我的应用程序的设计问题.


基本上,以下是我在我的应用程序中要做的事情.

单个任务是这样的:

  1. 从底层CoreData数据库中读取自定义对象
  2. 从网址下载json
  3. 解析json以更新自定义对象或创建一个新对象(解析可能需要1 - 3秒,大数据)
  4. 分析自定义对象(将涉及一些计算,可能需要1 - 5秒)
  5. 将自定义对象保存到CoreData数据库中.

可能会同时执行许多任务.

一个任务中的步骤显然是ordered(即,没有第2步下载json,第3步不能继续),但它们也可以discrete.我的意思是,例如,task2的第4步可以在task1的第3步之前执行(如果task2的下载速度比task1的更快)

任务有优先事项.用户可以启动具有更高优先级的任务,因此将尝试在所有其他任务之前执行所有任务的步骤.


我希望UI能够尽可能地响应.

所以我打算创建一个优先级最低的NSThread.

我在该线程中放置了一个自定义优先级事件队列.任务的每一步都成为一个事件(工作单位).因此,例如,下载json的步骤1成为事件.下载后,该事件会为步骤3生成另一个事件并将其放入队列中.每个事件都有自己的优先级设置.


现在我看到这篇文章:并发和应用程序设计.Apple建议我们Move Away from Threads使用GCDNSOperation.

我发现这NSOperation与我的草稿设计相匹配.但我有以下问题:

  • 考虑到iPhone/iPad cpu内核,我应该只使用一个NSOperationQueue还是创建多个?
  • NSOperationQueue或NSOperation是否以最低线程优先级执行?执行是否会影响UI响应(我关心因为步骤涉及计算)?
  • 我可以从另一个生成NSOpeartion并将其放入队列吗?我在NSOperation中没有看到队列属性,我怎么知道队列?
  • 如何将NSOperationQueue与CoreData合作?每次访问CoreData时,我应该创建一个新的上下文吗?这会贵吗?
  • 任务的每一步都成为NSOperation,这个设计是否正确?

谢谢

jus*_*tin 4

考虑到 iPhone/iPad 的 cpu 核心,我应该只使用一个 NSOperationQueue 还是创建多个 NSOperationQueue?

在大多数情况下,两个(CPU、网络+I/O)或三个(CPU、网络、I/O)串行队列应该可以很好地工作,以保持应用程序的响应能力,并使您的程序按其绑定的方式流式传输工作。当然,您可能会发现另一种组合/公式适用于您的特定工作分配。

NSOperationQueue 或 NSOperation 是否会以最低线程优先级执行?执行是否会影响 UI 响应(我关心,因为这些步骤涉及计算)?

默认情况下不是。看看-[NSOperation setThreadPriority:]你是否想降低优先级。

我可以从另一个 NSOpeartion 生成 NSOpeartion 并将其放入队列吗?我在 NSOperation 中没有看到队列属性,我如何知道队列?

当然。如果您使用我概述的串行方法,找到正确的队列就足够容易了——或者您可以使用 ivar。

NSOperationQueue 如何与 CoreData 配合?每次访问 CoreData 时,我都应该创建一个新的上下文吗?会很贵吗?

(没有意见)

任务的每一步都变成一个NSOperation,这样的设计正确吗?

是的 - 将队列划分到它所绑定的资源是一个好主意。