NSOperation在iPhone上

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

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

cocoa是我的女朋友有一个关于使用NSOperationNSOperationQueue的好教程 。 本教程利用NSOperation在不同的线程中同时下载几个网页。

另外,请参阅Mac Research的这篇文章 。

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

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

总之: NSOperationQueue

NSOperationQueue是线程安全的(您可以从不同的线程添加操作而不需要locking),并使您可以将NSOp对象链接在一起。

我的Flickr iPhone应用程序Reflections使用NSOperationNSOperationQueue来pipe理下载图像和XML

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

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

所有这些上面的答案都很好,但是请确保你阅读了上面的文章,并在代码中自由使用这一行:

 if ( self.isCancelled ) return; 

可口可乐提供的样品是我的女朋友,没有使用这条线,直到我从现场崩溃login,我意识到这是一个问题/概念。

这只是一个非常简单的实现,但需要花时间阅读教程,以充分理解一切:

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

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

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

一个可以尝试使用Swift的示例

 let operation : NSOperation = NSOperation() operation.completionBlock = { println("Completed") } let operationQueue = NSOperationQueue.mainQueue() operationQueue.addOperation(operation)