ios - NSOperationqueue有多少种调用方式?

标签 ios iphone ios7 nsoperationqueue

以下调用队列的类型有什么区别,哪种最好?

一个)

[NSURLConnection sendAsynchronousRequest:urlRequest queue:[NSOperationQueue mainQueue]  completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)

B)

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

        // Background work

    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
        // Main thread work (UI usually)
    }];
   }];

C) 添加已子类化到 NSoperationQueue 的 NSoperation,例如 http://www.cimgf.com/2008/02/16/cocoa-tutorial-nsoperation-and-nsoperationqueue/

D)

    [[NSOperation mainQueue] addOperation:myOperation]; 

这是正确的做法吗?因为此代码将 NSoperation 添加到 mainQueue。这对 后台任务。通常 mainQueue 仅用于更新 UI。

E)如果我遗漏了除上述 Queue 调用方法之外的任何内容,请在回答中也提及它们。

最佳答案

这些例子都不是最好的,它们之间甚至没有太大区别。顾名思义,NSOperationQueue 是一个队列,即包含操作的先进先出 (FIFO) 数据结构。您可以创建自己的操作队列,也可以使用现有的操作队列。

示例 A 是使用现有队列(主队列)的合理示例。您不希望在主线程(这是您通过 +mainQueue 获得的)上放置一个同步网络请求,因为它会阻塞用户界面,但这不一定是一个糟糕的选择,因为请求是异步的,传入的操作队列仅用于运行完成处理程序。事实上,完成处理程序可能需要操纵用户界面,而这应该从主队列完成。

示例 B 说明了创建一个新的操作队列并在该队列上安排一个操作。该操作依次在主队列上调度另一个操作。这是一个非常典型的场景——同样,您应该只从主线程操作 UI,因此让后台操作创建一个在主线程上运行的操作以更新 UI 是很常见的。

示例 C 与 B 类似,不同之处在于所讨论的操作是一个子类,而不是从 block 创建的操作。 NSOperation 在 Grand Central Dispatch 和 blocks 出现之前就已经存在了,过去创建一个能做一些有趣的操作的唯一方法是子类化 NSOperation 并覆盖 -主要。您链接的博客文章说它是在 2008 年 2 月 16 日发布的,这肯定是那个时代的。从 block 创建操作是一种较新且通常更简洁的样式,但是子类化并没有错,尤其是当您可能需要在多个地方执行相同类型的操作时。另请注意,该文章使用了 -performSelectorOnMainThread:withObject:waitUntilDone:,与创建另一个 NSOperation 相比,这是一种在主线程上运行某些内容的更简单方法> 子类。

Example D 过于模糊,无法真正评论——它只是展示了如何向主队列添加一些未指定的操作。你是对的,你不想为长时间运行的操作这样做——那些应该安排在后台队列上,而不是避免阻塞 UI。但是,如果不知道 myOperation 做了什么,就不能说它是对还是错。

因此,您的示例没有一个是错误的,也没有一个比另一个更好。就它们的不同而言,这是因为它们用于不同的情况。例如,NSURLConnection 将一个 NSOperationQueue 和一个 block 作为参数,因为它需要等到连接完成,然后才能安排从完成 block 创建的操作。但是,一旦连接完成,NSURLConnection 将执行您在示例 B 和 D 中看到的大部分内容。

关于ios - NSOperationqueue有多少种调用方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24074831/

相关文章:

ios - 什么时候使用像 (id<UISearchBarDelegate>)self 这样的东西?

ios - 如何将应用商店应用链接添加到应用内,而不是打开 "app store.app"?

ios - 如何检测 iPhone 5c 的颜色?

iphone - 更改 UIAlertView 的背景颜色?

iphone - 这是使用 ASIHTTPRequest 下载文件的正确方法吗?

ios - 如何更改 UITableView 和导航栏之间的高度

ios - 使用 AFNetworking 避免重复的 HTTP 请求

ios - 在 CloudKit 中查询引用的最佳方式?

ios - NSXMLParser:非 ASCII 字符的意外结果

ios - SwiftUI:如何在条件 View 之间添加转换?