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
只有在op1
, op2
和op3
执行完毕后才会运行。
[opQueue operationCount]
希望这可以帮助
一种方法是创build某种具有诸如loadedCount(最初为0)和fileCount(初始化为目录中的许多文件)属性的Directory类,并创build一个将每个NSOperation映射到相应Directory的字典,然后将操作添加到队列。 在你的isFinishedcallback函数里面,你可以把给出的NSOperation的Directory对象从字典中取出,并且将directory.loadedCount增加1.如果你的directory.loadedCount == directory.fileCount,触发UI的更新。
您可以重构代码以避免一次排入所有请求。 一次仅排出一个目录的请求。 当operationCount
达到零时,可以确定所有请求已完成或失败,更新UI并排队请求下一个目录。 继续,直到目录数组为空。
优点是:
- 相对简单
- 您不必查询文件系统就可以确定下载的内容
- 如果需要的话,可以在不改变其他逻辑的情况下重新入队失败的请求。