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

我需要在我的应用程序下载目录及其内容。 所以我决定实施一个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]

希望这可以帮助

一种方法是创build某种具有诸如loadedCount(最初为0)和fileCount(初始化为目录中的许多文件)属性的Directory类,并创build一个将每个NSOperation映射到相应Directory的字典,然后将操作添加到队列。 在你的isFinishedcallback函数里面,你可以把给出的NSOperation的Directory对象从字典中取出,并且将directory.loadedCount增加1.如果你的directory.loadedCount == directory.fileCount,触发UI的更新。

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

优点是:

  • 相对简单
  • 您不必查询文件系统就可以确定下载的内容
  • 如果需要的话,可以在不改变其他逻辑的情况下重新入队失败的请求。