Wiele osób pytało pytanie o podobnym tytule, ale bardzo różne przeznaczenie:dispatch_get_current_queue() przestarzałe, czy istnieje alternatywa dla bezpiecznego CoreData?
CoreData wymaga że śledzenie bieżącej kolejki bieżącego wątku i aktualnej NSOperationQueue (jeśli jesteś NSOperation) , jeśli zezwalasz na wywołania metod pochodzące z innych klas (które domyślnie każda klasa pozwala). Nie ma żadnych "maybes" na ten temat: jest to trudne wymaganie.
To dobrze, i ogólnie jest to łatwe, aby zapewnić:
NSAssert([NSThread currentThread].isMainThread || myPrivateQueue == dispatch_get_current_queue(), @"You tried to call this method from an external thread, or a queue other than my internal private queue. That's not legal, and will cause data corruption");
... chyba, że Apple ma i przestarzałej dispatch_get_current_queue(), podobno „, bo ludzie nadużywają go obejść brakuje funkcjonalność w GCD/bitów GCD, których nie rozumieli ".
Uwaga: moje użycie metody dispatch_get_current_queue() powyżej wydaje się być poprawne i nie jest obraźliwe, sądząc po komentarzu do nagłówka Apple: chodzi o to, że sprawdzam, czy kolejka jest prywatną, którą utworzyłem (co twierdzi Apple). jest dopuszczalnym użytkowaniem).
Pomijając mądrość wycofania czegoś po prostu ze względu na błędy w jego implementacji :(... ktoś znalazł sposób obejścia tego problemu przez Apple, w szczególności: z CoreData, musisz śledzić kolejkę - czy jest inny sposób to zrobić:
(ma to znaczenie, ponieważ: w przypadku CoreData, jeśli pozwolisz, aby coś przypadkowo wywołało taką metodę, nie dostaniesz "awarii", dostaniesz "dane zepsute, które pojawią się na . pewnym momencie w przyszłości, kiedy jest już za późno, by to naprawić ")
Używam 'dispatch_queue_set_specific()' i 'dispatch_get_specific()' dla aplikacji, o którą pytałem tutaj: http://stackoverflow.com/questions/12806506/how-can-i-verify-that- i-am-running-on-a-given-gcd-queue-without-using-dispatch-g i dobrze działa, aby zidentyfikować określone kolejki. Komentarz Jody na temat odpowiedzi wspomina użycie czegoś podobnego w Core Data. –
@BradLarson dispatch_get_specific() jest bardzo interesujący, dzięki. Nie jestem pewien, co się stanie, jeśli zadzwonisz, gdy nie będziesz w bloku (w prawidłowym wykonaniu, byłbyś, ale chciałbym wiedzieć, co stanie się, gdy coś pójdzie nie tak, ponieważ to jest konfiguracja, którą próbuję złapać/potwierdzić/zalogować się) – Adam
Nie wiem, czy bycie w bloku ma znaczenie. Wszystko, co testuje, to klucz przypisany do konkretnej kolejki, na której działa ten kod. Jak pokazuję, używam tego dla funkcji, która gwarantuje synchroniczne wykonanie kodu w konkretnej kolejce, albo przez synchroniczną wysyłkę bloku do kolejki, albo przez uruchomienie kodu bezpośrednio, jeśli już jest w tej kolejce. –