繁体   English   中英

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

[英]iOS - How to know when NSOperationQueue finish processing a few operations?

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

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

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

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

你有什么主意吗 ?

非常感谢

添加“完成” 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完成执行后运行。

[opQueue operationCount]

希望这可以帮助

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

优点是:

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

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

暂无
暂无

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

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