W przypadku tworzenia bardziej skomplikowanych aplikacji, na platformę mobilną Apple, szczególnie gdy wykorzystuje się klasy z przestrzeni CoreData, pojawia się problem „freez’ów” aplikacji. Podczas wykonywania wielu zapytań w krótkim czasie w głównym wątku aplikacji, dochodzi do sytuacji, w której widok nie zostaje odświeżany. Innymi słowy, jeżeli programista, chce np. aktualizować pasek postępu, musi wykonywać bardziej skomplikowane operacje w dodatkowym wątku, aby odciążyć wątek główny i móc aktualizować widok.
I o ile stworzenie nowego wątku, sprowadza się do prostego kodu:
/* Kolejka zadań - init (autorelease) */ NSOperationQueue *queue = [[NSOperationQueue alloc] init]; /* Stworzenie zadania, które dodamy do kolejki, które wywoła metodę "zadanie" w osobnym wątku */ NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(zadanie) object:nil]; /* Dodanie zadania do kolejki (wątku) */ [queue addOperation:operation]; [operation release]; [queue release];
W przypadku bardzo skomplikowanych operacji przy obiektach CoreData, szczególnie gdy np. dodawane jest wiele obiektów do bazy i wykonywana na NSManagedContext metoda save, może dojść do sytuacji, że coś pójdzie nie tak. Jak zachowa się aplikacja, gdy dojdzie do takiej sytuacji w głównym wątku? Odpowiedź nie jest jednoznaczna, albowiem zależy od bardzo istotnej rzeczy. Mianowicie zależy od tego, czy NSManagedContext został stworzony w obrębie wątku głównego czy też nowo utworzonego wątku pobocznego. W pierwszym przypadku, aplikacja przestanie odpowiadać, ale nie przestanie działać! Innymi słowy, aplikacja będzie próbować wykonać zapis do skutku, ale bez rezultatu. Rozwiązaniem tego problemu, jest stworzenie nowego obiektu NSManagedContext w obrębie metody zdarzenie, dzięki czemu, nawet jeśli któraś z operacji nie powiedzie się, aplikacja nadal będzie się wykonywać.
Więcej informacji na ten temat, można znaleźć w dokumentacji.
Link do obrazka promującego.