2012-04-03 58 views
10

我需要在我的应用程序下载目录及其内容。所以我决定实施一个NSOperationQueue和我的子类NSOperation来实现NSURLRequest等...iOS - 如何知道NSOperationQueue何时完成一些操作?

问题是我一次添加所有的操作,我无法弄清楚一个目录的所有文件按顺序下载更新用户界面并启用此特定目录。

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

我已经实现了NSOperationQueue的operationCount和NSOperation的isFinished的键值观察,但是我不知道一个目录何时拥有它中的所有文件!

你有什么想法吗?

非常感谢

+0

它是使用dispatch_group_async更方便。看到此链接[链接] [1] [1]:http://stackoverflow.com/questions/9632235/how-do-i-know-all-my-tasks-in-grand-central -dispatch-finished – Igor 2014-03-18 08:43:22

回答

47

添加一个“完成”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]; 

doneOpop1op2op3执行完毕才会运行。

+0

我忘了提及我的操作是并发的。你的例子还好吗? – Dabrut 2012-04-03 21:37:01

+0

当然,这是整个依赖关系的重点。在非并发操作队列中,您只需按正确顺序添加操作即可实现相同操作。但是一个操作只有在它的所有依赖完成执行之后才会运行。 – 2012-04-04 10:08:55

+0

荣誉给你。这正是我所期待的! – Dabrut 2012-04-04 20:14:34

0

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

+0

这是我的第一个想法。但我想知道这是否是正确的做法或者是否有更好的方法来做到这一点。 – Dabrut 2012-04-03 19:08:03

0

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

的优点是:

  • 相对简单
  • 你不必只查询文件系统中找出已经被下载
  • 如果需要的话,你可以重新入队失败请求而不改变其他逻辑。
5
 
[opQueue operationCount] 

希望这有助于

相关问题