代码之家  ›  专栏  ›  技术社区  ›  kubi

NShread vs.NSOperationQueue vs???在iPhone上

  •  29
  • kubi  · 技术社区  · 14 年前

    目前我正在使用 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];
    

    有什么理由不去看电视吗 n线程


    根据乔恩·埃里克的建议,我选择了 / NSOperation 类非常灵活,您可以根据需要将其用于调用、块或自定义子类。不管你如何创造你的 NSO操作 当您准备好运行它时,您可以将它放入操作队列中。这些操作被设计为作为放入队列的对象工作,或者如果需要,可以作为独立的异步方法运行它们。由于可以轻松地同步运行自定义操作方法,因此测试非常简单。

    自从我提出这个问题以来,我已经在一些项目中使用了同样的技术,我对它保持我的代码和测试干净、有序和愉快地异步的方式感到非常高兴。

    会再次成为子类吗

    2 回复  |  直到 13 年前
        1
  •  33
  •   Jon-Eric    14 年前

    一般来说,你会得到更好的里程数与 NSOperationQueue .

    • 它足够聪明,只创建大约与内核数量相同的线程,对剩余的操作进行排队。与 NSThread ,创建100个线程来缓存100个图像可能是一种过分的做法,而且效率较低。
    • cacheImage 操作。实施取消更容易 操作队列
    • 操作队列 现在或将来可以自由地切换到更智能的实现(如GrandCentralDispatch)。 n线程 更可能始终只是一个操作系统线程。

    奖金:

    • 操作队列
        2
  •  5
  •   shosti    14 年前

    我会用 NSOperationQueue . 在操作系统3.2下, 操作队列 在引擎盖下使用GCD,因此具有不需要单独线程开销的优点。我没有看过OS4的文档,但我怀疑它也有类似的功能——无论如何, 操作队列