我的应用程序存在设计问题。
基本上,以下是我要在我的应用程序中执行的操作。
单个任务是这样的:
- 从底层 CoreData 数据库中读取自定义对象
- 从 url 下载 json
- 解析 json 以更新自定义对象或创建新对象(解析可能需要 1 - 3 秒,大数据)
- 分析自定义对象(会涉及一些计算,可能需要 1 - 5 秒)
- 将自定义对象保存到 CoreData 数据库中。
可能有多个任务同时执行。
一个任务中的步骤显然是有序的
(即,如果没有第 2 步下载 json,第 3 步就无法继续),但它们也可以是离散的
。我的意思是,例如,task2 的第 4 步可以在 task1 的第 3 步之前执行(如果 task2 的下载速度可能比 task1 快的话)
任务有优先级。用户可以启动具有更高优先级的任务,这样任务的所有步骤都将在所有其他步骤之前尝试执行。
我希望 UI 能够尽可能地响应。
所以我打算创建一个优先级最低的 NSThread。
我在该线程中放置了一个自定义优先级事件队列。任务的每一步都成为一个事件(工作单元)。因此,例如,第 1 步下载 json 成为一个事件。下载完成后,该事件会为步骤 3 生成另一个事件,并放入队列中。每个事件都有自己的优先级设置。
现在我看到这篇文章:Concurrency and Application Design . Apple 建议我们远离线程
并使用GCD
或NSOperation
。
我发现 NSOperation
非常符合我的设计草案。但我有以下问题:
- 考虑到 iPhone/iPad 的 cpu 内核,我应该只使用一个 NSOperationQueue 还是创建多个?
- NSOperationQueue 或 NSOperation 会以最低线程优先级执行吗?执行是否会影响 UI 响应(我很关心,因为这些步骤涉及计算)?
- 我可以从另一个生成一个 NSOpeartion 并将其放入队列吗?我在 NSOperation 中没有看到队列属性,我怎么知道队列?
- 如何将 NSOperationQueue 与 CoreData 配合使用?每次访问 CoreData 时,我都应该创建一个新的上下文吗?会很贵吗?
- 任务的每一步都变成了一个NSOperation,这样的设计是否正确?
谢谢
最佳答案
In consideration of iPhone/iPad cpu cores, should I just use one NSOperationQueue or create multiple ones?
两个(CPU、网络+I/O)或三个(CPU、网络、I/O)串行队列在大多数情况下应该工作良好,以保持应用程序响应和您的程序流式传输工作受他们的约束。当然,您可能会发现其他组合/公式适用于您的特定工作分配。
Will the NSOperationQueue or NSOperation be executed with lowest thread priority? Will the execution affect the UI response (I care because the steps involve computations)?
默认情况下不是。如果您想降低优先级,请参阅 -[NSOperation setThreadPriority:]
。
Can I generate a NSOpeartion from another one and put it to the queue? I don't see a queue property in NSOperation, how do I know the queue?
当然。如果您使用我概述的串行方法,定位正确的队列就足够容易了——或者您可以使用 ivar。
How do I cooperate NSOperationQueue with CoreData? Each time I access the CoreData, should I create a new context? Will that be expensive?
(无评论)
Each step of a task become a NSOperation, is this design correct?
是的 - 将队列分配给它绑定(bind)的资源是个好主意。
关于iphone - 我应该使用 NSOperationQueue 和 NSOperation 而不是 NSThread 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12283787/