2013-05-10 9 views
5

Mam operację ładowania danych, która musi zostać usunięta z głównego wątku, aby uniknąć potencjalnych problemów z blokowaniem. Aby to zrobić, używam NSOperationQueue i NSOperations.Jak zablokować NSOperation do zakończenia zadania NSOperationQueue?

Jednym z problemów, które pojawiły się jednak, jest to, że jedna z operacji istnieje, aby odrodzić dodatkowe operacje w oparciu o przychodzące informacje. Próba rozwiązania tego problemu rozwiązała również drobne problemy, które miałem gdzie indziej, ponieważ rozwiązaniem, które podjąłem było przekazanie NSOperation własnej kolejki do pod zadań.

Problem polega na tym, że gdy tylko "główne" wyjścia, NSOperation będzie oznaczony jako "zakończony", niezależnie od tego, czy pod-kolejka jest zakończona, czy nie; jak mogę zmienić to zachowanie?

+0

Wygląda na to, że szukasz [równoczesnej 'NSOperation'] (http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/NSOperation_class/Reference/Reference.html)? –

+0

@CarlVeazey Nie ... dokładnie, ale wygląda na to, że kroki użyte do utworzenia równoczesnej operacji NSOperation robią to samo, czego właśnie szukam. Musisz zastąpić sposób, w jaki metoda startowa obsługuje metodę isFinished/isExecuting i myślę, że właśnie to muszę tutaj zrobić. Muszę przesłonić start, więc nie ustawi się, Finished natychmiast kończy się główna. Co oznacza posługiwanie się materiałem KVO, kiedy zmieniam te właściwości, och radości. – RonLugge

+0

@CodaFi Nie jestem pewien, czy wyraziłem się jasno, ale odpowiedź, którą zasugerowałeś, nie wydaje się mieć sensu. Zależności uniemożliwiają wykonanie operacji, nie zapobiegają jej zakończeniu po rozpoczęciu wykonywania. Przynajmniej tak mówią referencje. – RonLugge

Odpowiedz

1

Możesz wysłać wiadomość waitUntilAllOperationsAreFinished do kolejki podrzędnej przed wyjściem z głównej metody operacji. Jest to łatwe, ale nie jest to dobry pomysł, ponieważ blokuje cały wątek, który jest raczej nieekonomiczny.

Lepszym rozwiązaniem byłoby użycie systemu zależności. Utwórz kolejną operację zależną od głównej operacji. Po utworzeniu operacji podrzędnych dodaj je również jako zależność od tej nowej operacji "wykańczania".

1

jak najszybciej „główne” wyjścia The NSOperation zostanie oznaczona jako „gotowy”,

Ta logika jest zaimplementowana w [NSOperation start], więc po prostu trzeba zastąpić go z niestandardowego logiki : wywołanie main, które spawnuje kilka dodatkowych operacji, które po zakończeniu ustawiają stan isFinished na operacji.

Powiązane problemy