【发布时间】:2012-09-05 14:30:07
【问题描述】:
我的应用面临设计问题。
基本上,以下是我将在我的应用程序中执行的操作。
单个任务是这样的:
- 从底层 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 步生成另一个事件并放入队列中。每个事件都有自己的优先级设置。
现在我看到这篇文章:Concurrency and Application Design。苹果建议我们Move Away from Threads 并使用GCD 或NSOperation。
我发现NSOperation 非常符合我的草稿设计。但我有以下问题:
- 考虑到 iPhone/iPad cpu cores,我应该只使用一个 NSOperationQueue 还是创建多个?
- NSOperationQueue 或 NSOperation 会以最低线程优先级执行吗?执行是否会影响 UI 响应(我很在意,因为这些步骤涉及计算)?
- 我可以从另一个生成一个 NSOperation 并将其放入队列吗?我在 NSOperation 中没有看到队列属性,我怎么知道队列?
- 如何配合 NSOperationQueue 和 CoreData?每次访问 CoreData 时,我应该创建一个新的上下文吗?会很贵吗?
- 任务的每一步都变成了 NSOperation,这样的设计是否正确?
谢谢
【问题讨论】:
-
这是很多问题。考虑将每个问题作为一个单独的问题提出。只有最后一个需要有关您的特定应用程序的任何信息。
标签: iphone objective-c nsthread nsoperation nsoperationqueue