繁体   English   中英

NSOperation在iPhone上

[英]NSOperation on the iPhone

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

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

Cocoa Is My Girlfriend有一个关于使用NSOperationNSOperationQueue好教程 本教程利用NSOperation在不同的线程中同时下载多个网页。

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

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

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

总之一句话: NSOperationQueue

NSOperationQueue是线程安全的(您可以从不同的线程向其添加操作而无需锁定),并使您能够将NSOp对象链接在一起。

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

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

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

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

if ( self.isCancelled ) return;

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

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

NSOperationQueue *queue = [NSOperationQueue new];

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

[queue addOperation:operation];

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

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

您可以尝试使用Swift的示例

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM