41

我一直在寻找一些具体场景,NSOperation说明 iPhone 何时是在应用程序中使用的理想工具。据我了解,这是围绕编写您自己的threaded代码的包装。我还没有看到任何使用它的 Apple 演示应用程序,我想知道我是否错过了一个很棒的工具而不是使用NSThread.

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

4

7 回答 7

43

Cocoa Is My Girlfriend 有一个很好的教程NSOperation,介绍了和的使用NSOperationQueue。本教程利用NSOperation在单独的线程中同时下载多个网页。

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

于 2009-05-06T18:26:05.933 回答
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];
于 2009-05-07T08:57:07.040 回答
10

一句话:NSOperationQueue

NSOperationQueue是线程安全的(你可以从不同的线程向它添加操作,而不需要锁)并且使你能够将 NSop 对象链接在一起。

我的 Flickr iPhone 应用程序 Reflections广泛用于管理下载图像NSOperation和.NSOperationQueueXML

警告:确保您阅读、重新阅读并理解文档在谈论“并发”时的含义。

于 2009-05-07T00:58:12.090 回答
6

您还应该查看此 URL:http: //developer.apple.com/cocoa/managingconcurrency.html

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

if ( self.isCancelled ) return;

Coca is my Girlfriend 提供的样本中没有使用该行,直到我从现场获得崩溃日志后,我才意识到这是一个问题/概念。

于 2011-06-09T01:38:25.470 回答
5

这只是一个非常简单的实现,但需要花时间阅读教程以完全理解所有内容:

NSOperationQueue *queue = [NSOperationQueue new];

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

[queue addOperation:operation];
于 2013-03-27T19:54:23.807 回答
1

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

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

于 2013-05-21T22:04:48.587 回答
1

您可以尝试使用 Swift 的示例

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

let operationQueue = NSOperationQueue.mainQueue()
operationQueue.addOperation(operation)
于 2014-07-27T19:02:32.240 回答