iOS - 如何知道NSOperationQueue何时完成一些操作?

时间:2012-04-03 17:42:31

标签: iphone ios ipad download nsoperation

我需要在我的应用程序中下载目录及其内容。所以我决定实现一个NSOperationQueue,我将NSOperation子类化为实现NSURLRequest等......

问题是我一次添加所有操作,我无法弄清楚何时下载一个目录的所有文件以更新UI并启用此特定目录。

现在我必须等待所有目录中的所有文件都被下载才能更新UI。

我已经为NSOperationQueue的operationCount和NSOperation的isFinished实现了键值观察,但我不知道目录何时包含所有文件!

你有什么想法吗?

非常感谢

4 个答案:

答案 0 :(得分:48)

添加一个“完成”NSOperation,其中包含一个目录的所有其他NSOperations作为依赖项。

这样的事情:

NSInvocationOperation *doneOp = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(done:) object:nil];

NSInvocationOperation *op1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(doSomething:) object:nil];
[queue addOperation:op1];
[doneOp addDependency:op1];

NSInvocationOperation *op2 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(doSomething:) object:nil];
[queue addOperation:op2];
[doneOp addDependency:op2];

NSInvocationOperation *op3 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(doSomething:) object:nil];
[queue addOperation:op3];
[doneOp addDependency:op3];

[queue addOperation:doneOp];

doneOp只会在op1op2op3执行完毕后才会投放。

答案 1 :(得分:5)

[opQueue operationCount]

希望这有帮助

答案 2 :(得分:0)

一种方法是使用诸如loadedCount(最初为0)和fileCount(在目录中初始化为多个文件)之类的属性创建某种Directory类,并在添加之前创建将每个NSOperation映射到相应目录的字典对队列的操作。在你的isFinished回调中,你可以将给定NSOperation的Directory对象从字典中拉出来并将directory.loadedCount递增1.如果你的directory.loadedCount == directory.fileCount,则触发对UI的更新。

答案 3 :(得分:0)

您可以重构代码以避免一次将所有请求排入队列。一次仅排队一个目录的请求。当operationCount达到零时,您可以确保所有请求都已完成或失败,更新UI并将请求排入下一个目录。继续,直到目录数组为空。

优点是:

  • 相对简单
  • 您不必查询文件系统只是为了弄清楚已下载的内容
  • 如果需要,您可以在不更改其他逻辑的情况下重新排队失败的请求。