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

iphone-我应该使用NSOperationQueue和NSOperation而不是NSThread吗?,iphone,objective-c,nsthread,nsoperation,nsoperationqueue,Iphone,Objective C,Nsthread,Nsoperation,Nsoperationqueue,我面临着我的应用程序的设计问题 基本上,以下是我将在我的应用程序中执行的操作 单个任务如下所示: 从底层CoreData数据库读取自定义对象 从url下载json 解析json以更新自定义对象或创建新对象(解析可能需要1-3秒,大数据) 分析自定义对象(需要进行一些计算,可能需要1-5秒) 将自定义对象保存到CoreData数据库中 可能有许多任务同时执行 一个任务中的步骤显然是有序的(即,如果没有步骤2下载json,步骤3将无法继续),但它们也可以是离散的。我的意思是,例如,task2的步骤

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


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

单个任务如下所示:

  • 从底层CoreData数据库读取自定义对象
  • 从url下载json
  • 解析json以更新自定义对象或创建新对象(解析可能需要1-3秒,大数据)
  • 分析自定义对象(需要进行一些计算,可能需要1-5秒)
  • 将自定义对象保存到CoreData数据库中
  • 可能有许多任务同时执行

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

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


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

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

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


    现在我看到这篇文章:。苹果建议我们
    远离线程
    ,使用
    GCD
    NSOperation

    我发现
    NSOperation
    非常符合我的设计初稿。但我有以下问题:

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

    • 从外观上看,NSOperationQueue是您所追求的。您可以设置同时运行的并发操作数。如果使用多个NSO操作,它们将同时运行。。。除非您自己处理队列,否则这与使用NSOperationQueue相同

    • 线程优先级。。。我不知道你的意思,但在iOS中,UI绘图、事件和用户交互都在主线程上运行。如果您是在后台线程上运行,那么无论您运行的操作有多么复杂或cpu占用量有多大,界面都将保持响应

    • 生成和处理操作您应该在主线程上执行,因为这不会花费任何时间,您只需在后台线程中运行它们,这样您的主线程就不会被锁定

    • CoreData,我没有专门使用过它,但到目前为止,我使用过的每一个Core~都能在后台线程上完美地工作,所以这不应该是一个问题

    • 就设计而言,这只是一个观点。。。至于我,我会选择每个任务一个NSO操作,让它处理所有步骤。如果您想提供一些反馈或继续进行另一次下载或其他工作,那么可以在一个步骤完成时编写回调

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

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

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

    不是默认的。如果要降低优先级,请参阅
    -[NSOperation setThreadPriority:

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

    当然。如果您使用我概述的串行方法,那么定位正确的队列就很容易了——或者您可以使用ivar

    如何与CoreData配合NSOperationQueue?每次访问CoreData时,是否应创建新的上下文?那会很贵吗

    (无可奉告)

    任务的每一步都成为一个NSO操作,这种设计正确吗


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

    多线程处理时的计算效果不会因为您使用的是NSThread而不是NSOperation而有所不同。但是请记住,当前的iOS设备必须使用双核处理器

    你的一些问题不是很具体。您可能希望也可能不希望使用多个NSOperationQueue。这完全取决于你想如何处理它。如果您有不同的NSOperation子类或不同的NSBlockOperations,则可以使用优先级管理执行顺序,或者您可能希望为不同类型的操作使用不同的队列(尤其是在使用串行队列时)。我个人喜欢在处理相同类型的操作时使用1个操作队列,在操作不相关/不可靠时使用不同的操作队列。这使我可以灵活地取消和停止操作