2012-04-03 11 views
10

Potrzebuję w mojej aplikacji, aby pobrać katalogi i ich zawartość. Więc zdecydowałem się zaimplementować NSOperationQueue i podklasowałem NSOperation, aby zaimplementować NSURLRequest itd.iOS - Jak sprawdzić, kiedy NSOperationQueue zakończy przetwarzanie kilku operacji?

Problem polega na tym, że dodam wszystkie operacje naraz i nie mogę określić, kiedy wszystkie pliki dla jednego katalogu są pobierane w kolejności zaktualizować interfejs użytkownika i włączyć ten konkretny katalog.

Teraz muszę poczekać, aż wszystkie pliki ze wszystkich katalogów zostaną pobrane w celu aktualizacji interfejsu użytkownika.

Już zaimplementowałem obserwowanie wartości klucz-wartość dla operacjiCount z NSOperationQueue i isFinished z NSOperation, ale nie wiem, kiedy katalog zawiera wszystkie pliki w nim!

Masz jakiś pomysł?

Thanks a lot

+0

Jest bardziej wygodny w użyciu dispatch_group_async. Zobacz ten link [LINK] [1] [1]: http://stackoverflow.com/questions/9632235/how-do-i-know-all-my-tasks-in-grand-central -dispatch-finished – Igor

Odpowiedz

47

Dodaj „Gotowe” NSOperation który ma wszystkie inne NSOperations do jednego katalogu jako zależność.

coś takiego:

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 będzie działać dopiero po op1, op2 i op3 zakończeniu wykonywania.

+0

Zapomniałem wspomnieć, że moje operacje są równoległe. Czy Twój przykład jest nadal w porządku? – Dabrut

+0

Oczywiście, to jest cały punkt zależności. W kolejce operacji o współbieżnym działaniu wystarczy dodać operacje w odpowiedniej kolejności, aby osiągnąć to samo. Ale operacja nie zostanie uruchomiona, dopóki nie zakończą się wszystkie jej zależności. –

+0

Kudos do ciebie. Właśnie tego szukałem! – Dabrut

0

Jedno podejście byłoby utworzyć jakąś klasę katalogu z właściwości, takie jak loadedCount (początkowo 0) i FileCount (inicjowane jednak wielu plików znajdują się w katalogu) i stworzenie słownika mapowanie każdą operację NSOperation do odpowiedniego katalogu przed dodaniem operacji do kolejki. Wewnątrz callback dla isFinished, możesz wyciągnąć obiekt Directory dla danej NSOperation ze słownika i podkodować katalog.loadedCount o 1. Jeśli twój directory.loadedCount == katalog.fileCount, wyzwala aktualizację do interfejsu użytkownika.

+0

To był mój pierwszy pomysł. Ale zastanawiałem się, czy to był właściwy sposób, aby to zrobić, czy był lepszy sposób to zrobić. – Dabrut

0

Możesz zmienić kod, aby uniknąć wpisywania wszystkich żądań na raz. Kolejkuj tylko żądania dla pojedynczego katalogu na raz. Gdy operationCount osiągnie zero, możesz być pewien, że wszystkie żądania zostały zakończone lub nie, zaktualizuj interfejs użytkownika i wprowadź kolejność żądań do następnego katalogu. Kontynuuj, aż tablica katalogów będzie pusta.

Zaletami są:

  • względna prostota
  • nie trzeba kwerendy system plików tylko dowiedzieć się, co zostało pobrane
  • jeśli zajdzie taka potrzeba, można ponownie enqueue zawiodły wnioski bez zmiany innej logiki.
5
 
[opQueue operationCount] 

Nadzieja to pomaga

Powiązane problemy