iphone - NSThread vs. NSOperationQueue vs. ???在 iPhone 上

标签 iphone nsthread nsoperationqueue grand-central-dispatch

目前我正在使用 NSThread 在另一个线程中缓存图像。

[NSThread detachNewThreadSelector:@selector(cacheImage:) toTarget:self withObject:image];

或者:

[self performSelectorInBackground:@selector(cacheImage:) withObject:image];

或者,我可以使用 NSOperationQueue

NSInvocationOperation *invOperation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(cacheImage:) object:image];
NSOperationQueue *opQueue = [[NSOperationQueue alloc] init];
[opQueue addOperation:invOperation];

有什么理由要放弃 NSThread 吗?当它针对 iPhone 发布时,GCD 是第四个选项,但除非有显着的性能提升,否则我宁愿坚持使用适用于大多数平台的方法。

<小时/>

根据 @Jon-Eric 的建议,我采用了 NSOperationQueue/NSOperation 子类解决方案。它运作得很好。 NSOperation 类非常灵活,您可以根据需要将其与调用、 block 或自定义子类一起使用。无论您如何创建 NSOperation,当您准备好运行它时,您都可以将其放入操作队列中。这些操作被设计为可以作为放入队列的对象来工作,也可以根据需要将它们作为独立的异步方法运行。由于您可以轻松地同步运行自定义操作方法,因此测试非常简单。

自从我提出这个问题以来,我在几个项目中使用了同样的技术,我对它保持我的代码和测试干净、有组织和异步的方式感到非常满意。

A++++++++++ 将再次子类化

最佳答案

一般来说,使用 NSOperationQueue 会获得更好的效果。

三个具体原因:

  • 您可能希望一次启动多个项目的缓存。 NSOperationQueue 足够智能,只创建与核心数量相同的线程,并对剩余的操作进行排队。使用 NSThread,创建 100 个线程来缓存 100 个图像可能有点矫枉过正,而且效率有些低下。
  • 您可能想要取消 cacheImage 操作。使用 NSOperationQueue 实现取消更容易;大部分工作已经为您完成。
  • NSOperationQueue 现在或将来可以自由切换到更智能的实现(例如 Grand Central Dispatch)。 NSThread 更有可能始终只是一个操作系统线程。

奖金:

  • NSOperationQueue 还内置了一些其他不错的构造,例如尊重操作优先级和依赖性的复杂方法。

关于iphone - NSThread vs. NSOperationQueue vs. ???在 iPhone 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3041837/

相关文章:

objective-c - 在 iOS 8 的横向显示状态栏

iphone - 如何从通过 NSthread 调用的函数中获取返回值?

iphone - 运行循环实际上是如何工作的

ios - "[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]"使UI无响应

objective-c - objective-c - 取消 NSOperationQueue 中的操作

objective-c - 在附加到 NSOperationQueue operationsCount 的 observeValueForKeyPath 中崩溃

iphone - 如何知道 UIkeyboard 是否出现在 iOS 中?

iphone - ffmpeg 在 iOS 上的使用

ios - NSOperation 用户信息字典

iphone - 如何在 UIView 和 EAGLView 之间进行混合?