我需要在我的应用程序中下载目录及其内容。所以我决定实现一个NSOperationQueue,我将NSOperation子类化为实现NSURLRequest等......
问题是我一次添加所有操作,我无法弄清楚何时下载一个目录的所有文件以更新UI并启用此特定目录。
现在我必须等待所有目录中的所有文件都被下载才能更新UI。
我已经为NSOperationQueue的operationCount和NSOperation的isFinished实现了键值观察,但我不知道目录何时包含所有文件!
你有什么想法吗?
非常感谢
答案 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
只会在op1
,op2
和op3
执行完毕后才会投放。
答案 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并将请求排入下一个目录。继续,直到目录数组为空。
优点是: