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

时间:2010-06-15 00:24:28

标签: 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? GCD是iPhone上发布的第四个选项,但除非获得显着的性能提升,否则我宁愿坚持使用适用于大多数平台的方法。


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

我在一些项目中使用了同样的技术,因为我问了这个问题,我对它保持我的代码和我的测试干净,有条理和快乐异步的方式感到高兴。

一个++++++++++ 将继承子类

2 个答案:

答案 0 :(得分:32)

一般情况下,使用NSOperationQueue可以获得更好的里程数。

三个具体原因:

  • 您可能希望一次启动多个项目的缓存。 NSOperationQueue足够聪明,只能创建与核心一样多的线程,对剩余的操作进行排队。使用NSThread,创建100个线程来缓存100个图像可能有点过分,效率也不高。
  • 您可能想要取消cacheImage操作。使用NSOperationQueue可以更轻松地实施取消大多数工作已经完成了。
  • 现在或将来,
  • NSOperationQueue可以自由切换到更智能的实施(如Grand Central Dispatch)。 NSThread更可能永远只是一个操作系统线程。

加成:

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

答案 1 :(得分:5)

我会使用NSOperationQueue。在OS 3.2下,NSOperationQueue使用引擎下的线程,因此这两种方法应该执行类似的操作。但是,在Mac OS 10.6下,NSOperationQueue使用GCD,因此具有不需要单独线程开销的优点。我没有看过OS 4的文档,但我怀疑它有类似的东西 - 无论如何,如果/当GCD的性能优势可用于iPhone时,NSOperationQueue可以交换实现。