以下调用队列的类型有什么区别,哪种最好?
一个)
[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/