目前我正在使用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
,只要准备好运行它,就可以将其放入操作队列中。如果需要,这些操作可以作为您放入队列的对象,也可以作为独立的异步方法运行。由于您可以轻松地同步运行自定义操作方法,因此测试非常简单。
我在一些项目中使用了同样的技术,因为我问了这个问题,我对它保持我的代码和我的测试干净,有条理和快乐异步的方式感到高兴。
一个++++++++++ 将继承子类
答案 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
可以交换实现。