什么是nsoperation?如何使用它?

时间:2017-01-29 15:21:09

标签: objective-c multithreading macos concurrency nsoperation

我正在实施联系人模块,主要是添加,删除,搜索和列出联系人。

在这里,我使用文件来保存数据,例如将所有联系人存储在文件(json格式)中并反序列化回对象。

现在我的目标是使用nsoperation在后台线程中执行序列化和反序列化函数。以及一个类如何扩展nsopertions以及该类中的操作。

我是mac os的新手。我无法理解nsoperation究竟意味着什么?如何在我的module.how中使用它以使它们同时运行。我看过很多教程但是对我来说它仍然非常笨拙。我真的需要帮助。谢谢。

1 个答案:

答案 0 :(得分:3)

我们对您的问题有很多答案

什么是NSOperation?

First Apple Reference Says

  

NSOperation类是一个用于封装的抽象类   与单个任务关联的代码和数据。因为它是抽象的,   你不直接使用这个类,而是使用子类或使用其中一个   系统定义的子类(NSInvocationOperation或   BlockOperation)执行实际任务。尽管是抽象的,   NSOperation的基础实现确实包含重要的逻辑   协调安全执行任务。存在这个   内置逻辑允许您专注于实际的实现   你的任务,而不是确保它工作所需的胶水代码   正确使用其他系统对象。

Then Simple meaning of NSOperation

  

NSOperation代表一个单一的工作单元。这是一个抽象类   它提供了一个有用的,线程安全的结构来建模状态,   优先级,依赖关系和管理。

您是否需要同时运行?

What is Concurrency?

  

同时做多件事。

     

利用多核CPU中可用的核心数量。

     

并行运行多个程序。

为什么选择NSOperationQueue?

  

对于NSOperation建立一个没有意义的情况   自定义NSOperation子类,Foundation提供具体的   实现NSBlockOperation和NSInvocationOperation。

     

适合NSOperation的任务示例包括:   网络请求,图像大小调整,文本处理或任何其他   可重复的,结构化的,长期运行的任务,产生相关的   国家或数据。

     

但是简单地将计算包装到对象中并没有太大作用   有点疏忽。这就是 NSOperationQueue 进来的地方

什么是NSOperationQueue?

  

NSOperationQueue规定了并发执行操作。它   充当优先级队列,以便在a中执行操作   大致以先进先出的方式更高优先级   (NSOperation.queuePriority)跳得越来越快   优先级较低的。 NSOperationQueue也可以限制最大值   在任何给定时刻要执行的并发操作数,   使用maxConcurrentOperationCount属性。

     

NSOperationQueue本身由Grand Central Dispatch队列支持,   虽然这是私人实施细节。

     

要启动NSOperation,请先调用start,或将其添加到   NSOperationQueue,一旦它到达前面就让它开始   队列。由于NSOperation的这么多好处来自于   NSOperationQueue,添加操作几乎总是更好   一个队列而不是直接调用start。

Also

  

操作队列通常提供用于运行它们的线程   操作。在OS X v10.6及更高版本中,操作队列使用   libdispatch库(也称为Grand Central Dispatch)启动   执行他们的业务。结果,操作总是如此   在一个单独的线程上执行,无论它们是否存在   指定为并发或非并发操作

所以你的代码应该是

 NSOperationQueue *backgroundQueue = [[NSOperationQueue alloc] init];
 [backgroundQueue addOperationWithBlock:^{

    //Your Background Work kHere
    .....

    [[NSOperationQueue mainQueue] addOperationWithBlock:^{

      //Your Main Thread(UI) Work Here
      ....
    }];
 }];