2012-04-03 30 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] 

希望這有助於

相關問題