【问题标题】:what is nsoperation?how to use it?什么是nsoperation?如何使用它?
【发布时间】:2017-01-29 15:21:08
【问题描述】:

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

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

现在我的目标是使用 nsoperation 在后台线程中执行序列化和反序列化功能。以及一个类如何扩展 nsopertions 以及在该类中做什么。

我是 mac os 的新手。我不明白 nsoperation 到底是什么意思?如何在我的模块中使用它。如何让它们同时运行。我看过很多教程,但对我来说仍然很笨拙。我我真的需要帮助。提前致谢。

【问题讨论】:

  • 您阅读过 Apple 的文档吗?你不明白什么?你也读过 GCD 吗?看过 WWDC 视频吗?

标签: objective-c multithreading macos concurrency nsoperation


【解决方案1】:

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

什么是 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 规范操作的并发执行。它 充当优先级队列,使得操作在一个 大致先进先出的方式,具有更高的优先级 (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
      ....
    }];
 }];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-03
    • 1970-01-01
    相关资源
    最近更新 更多