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

标签 iphone objective-c nsthread nsoperation nsoperationqueue

我的应用程序存在设计问题。


基本上,以下是我要在我的应用程序中执行的操作。

单个任务是这样的:

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

可能有多个任务同时执行。

一个任务中的步骤显然是有序的(即,如果没有第 2 步下载 json,第 3 步就无法继续),但它们也可以是离散的。我的意思是,例如,task2 的第 4 步可以在 task1 的第 3 步之前执行(如果 task2 的下载速度可能比 task1 快的话)

任务有优先级。用户可以启动具有更高优先级的任务,这样任务的所有步骤都将在所有其他步骤之前尝试执行。


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

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

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


现在我看到这篇文章:Concurrency and Application Design . Apple 建议我们远离线程并使用GCDNSOperation

我发现 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/

相关文章:

iphone - 我们如何使用别人的 Enterprise 程序对 iPhone 应用程序进行签名?

ios - CGRect 与 4 个矩形相交。如何找出它与哪个矩形最相交?

ios - 在 iOS 中的 BLE 上写入数据时出现未知错误

iphone - 如何在 iphone 中停止 NSThread 子线程

c# - 文件上传 iphone c# aspx

ios - 针对 iPad 和 iPhone 进行测试时颜色不同

ios - View Controller 之间的对象共享

iphone - 在触摸时更改条形按钮项目的选择器

objective-c - RetainCount 可以在这种情况下使用吗?

iphone - 使用 [NSThread sleepForTimeInterval :2. 0] 时可以停止或取消循环功能吗?在 IOS 中