2009-05-06 34 views
41

我一直在寻找一些具体的场景,当iPhone上的NSOperation是一个理想的工具在应用程序中使用。据我的理解,这是一个围绕你自己的threaded代码的封装。我还没有看到任何苹果演示应用程序使用它,我想知道如果我错过了一个伟大的工具,而不是使用NSThreadNS操作iPhone

这里的理想解决方案是描述NSOperation的用例场景以及如何使用它来解决您的问题。

+22

样品您可能要考虑选择这些优秀的答案,作为解决方案之一。 (: – corydoras 2009-12-16 03:21:19

回答

43

可可是我的女朋友有good tutorial使用NSOperationNSOperationQueue。本教程利用NSOperation在不同的线程中同时下载几个网页。

另外,参见Mac Research的this article

+0

这里还有另一个教程:http://www.dribin.org/dave/blog/archives/2009/05/05/concurrent_operations/ – wbyoung 2009-05-06 21:17:40

+0

我还建议重写Standord Class教材,他们广泛使用NSOperation到flickr例子中的异步加载图像,它们可以在iTunes上免费获得 – Jab 2009-05-07 15:00:29

10

一句话:NSOperationQueue

NSOperationQueue是线程安全的(你可以从不同的线程添加进行操作即可,而不需要锁),使您能够链NSOP对象在一起。

我的Flickr iPhone应用程序Reflections使用NSOperationNSOperationQueue广泛地管理下载图像和XML

警告:确保您阅读,重新阅读并了解文档在讨论“并发性”时的含义。

+2

实际上,它不是*真正*线程安全的,它在Mac OS X 10.5上有问题,请参阅http://www.mikeash.com尽管他们提到iPhone似乎是免疫的,因为单核心处理器 – nduplessis 2009-05-07 08:52:11

33

我在我的iPhone应用程序中使用它的方式是基本上在我的应用程序委托中创建一个NSOperationQueue成员,并通过属性使其可用。然后,每当我需要在后台运行某些内容时下载一些XML我会创建一个NSInvocationOperation并将其发送到队列。

NSInvocationOperation *operationToPerform = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(updateXML) object:nil]; 
[[(MyAppDelegate *)[[UIApplication sharedApplication] delegate] sharedOperationQueue] addOperation:operationToPerform]; 
[op release]; 
6

你也应该看看这个网址: http://developer.apple.com/cocoa/managingconcurrency.html

所有以上这些答案都是伟大的,但请务必阅读上面的文章,并自由使用这行代码中的:

if (self.isCancelled) return; 

Coca提供的样本中没有使用该行,这是我的女朋友,直到我从现场崩溃登录后,才意识到这是一个问题/概念。

5

这里只是一个非常简单的实现,但需要时间来阅读教程,完全明白了一切:

NSOperationQueue *queue = [NSOperationQueue new]; 

NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self 
    selector:@selector(methodToCall) 
    object:objectToPassToMethod]; 

[queue addOperation:operation]; 
1

我用它异步处理。这是从Web服务获取数据或协调需要大量时间运行的操作的最佳方式。因为它们是线程安全的,异步的(不会捆绑主线程),并且它们支持依赖关系,所以它们对于您的工具集来说是非常棒的工具。

依赖性允许您进行多个独立的操作,并确保以特定顺序执行并成功或出错。当你需要同步一堆数据时,这非常棒,但在同步子对象之前需要父对象进行同步。

1

,你可以尝试使用雨燕

let operation : NSOperation = NSOperation() 
operation.completionBlock = { 
println("Completed") 
} 

let operationQueue = NSOperationQueue.mainQueue() 
operationQueue.addOperation(operation)