Czy istnieje odpowiednik [NSOperationQueue currentQueue]
lub [NSThread currentThread]
dla NSOperation
?Jak uzyskać dostęp do aktualnie wykonywanej NSOperacji?
Mam dość złożony model domeny, w którym ciężkie przetwarzanie odbywa się dość głęboko w stosie wywołań. Aby anulować operację w odpowiednim czasie, musiałbym przekazać NSOperation
jako parametr do każdej metody, aż dojdę do punktu, w którym chcę przerwać dłuższą pętlę. Używając wątków, mógłbym użyć [[NSThread currentThread] isCancelled]
, więc byłoby to wygodne, gdyby istniał odpowiednik dla NSOperation, niestety jest tylko pozornie bezużyteczny [NSOperationQueue currentQueue]
.
-1 obawiam. Nic z tego nie zadziała. Ustawienie właściwości isCancelled operacji nie będzie miało żadnego efektu, chyba że operacja okresowo sprawdza właściwość isCancelled. Z pewnością KVO nie będzie działać, ponieważ powiadomienia KVO są odbierane w tym samym wątku, w którym są wysyłane. – JeremyP
Errr ... Czy przeczytałeś mój post przed głosowaniem w dół? Obserwowanie tych właściwości jest * dokładnie * jak te rzeczy są zrobione. Obserwujesz zmianę stanu, a następnie użyj funkcji -performSelectorOnMainThread ..., aby zrobić wszystko, co trzeba zrobić w głównym wątku. "Nic z tego nie zadziała" to dla mnie nowość, ponieważ mam kilka aplikacji właśnie takich. Ponadto, nigdy nie powiedziałem, że * ustawić * anulowanie. W rzeczywistości powiedziałem, że kolejka anuluje operację, a operacja sprawdza okresowo ten stan i przestaje działać, jeśli jest prawdziwa. –
Co się dzieje: kolejka kasuje ops -> op posty KVO notatka isCancelled, uchwyty się zatrzymują -> Observer (niektórzy kontroler twoich) notatek się zmienia, a jeśli ma do zrobienia, robi to w głównym wątku. Działa za każdym razem. To, że twój kontroler jest przesyłany w innym wątku, nie oznacza, że nie poradzi sobie z tym. Jeśli ma coś zrobić w głównym wątku, idź przed siebie i wyślij coś w głównym wątku. –