我正面临我的应用程序的设计问题。
基本上,以下是我将在我的应用程序中执行的操作。
单个任务是这样的:
- 从底层 CoreData 数据库中读取自定义对象
- 从 url 下载 json
- 解析 json 以更新自定义对象或创建一个新对象(解析可能需要 1 - 3 秒,大数据)
- 分析自定义对象(会涉及一些计算,可能需要 1 - 5 秒)
- 将自定义对象保存到 CoreData 数据库中。
可能有许多任务同时执行。
一项任务中的步骤显然是ordered
(即,没有第 2 步下载 json,第 3 步无法继续),但它们也可以是discrete
. 我的意思是,例如,task2 的第 4 步可以在 task1 的第 3 步之前执行(如果 task2 的下载速度可能比 task1 的快)
任务有优先级。用户可以启动具有更高优先级的任务,因此将尝试在所有其他步骤之前执行该任务的所有步骤。
我希望 UI 可以尽可能地响应。
所以我打算创建一个优先级最低的 NSThread。
我在该线程中放置了一个自定义优先级事件队列。任务的每一步都成为一个事件(工作单元)。因此,例如,第 1 步下载 json 成为一个事件。下载后,该事件为第 3 步生成另一个事件并放入队列中。每个事件都有自己的优先级设置。
现在我看到这篇文章:并发和应用程序设计。苹果建议我们Move Away from Threads
使用GCD
or NSOperation
。
我发现这NSOperation
非常符合我的草稿设计。但我有以下问题:
- 考虑到 iPhone/iPad cpu 核心,我应该只使用一个 NSOperationQueue 还是创建多个?
- NSOperationQueue 或 NSOperation 会以最低的线程优先级执行吗?执行是否会影响 UI 响应(我关心,因为这些步骤涉及计算)?
- 我可以从另一个生成一个 NSOperation 并将其放入队列吗?我在 NSOperation 中没有看到队列属性,我怎么知道队列?
- 如何将 NSOperationQueue 与 CoreData 合作?每次访问 CoreData 时,我应该创建一个新的上下文吗?那会贵吗?
- 一个任务的每一步都变成了一个NSOperation,这样的设计对吗?
谢谢