Kategorie
iPhone mobile poradniki

iPhone: problem z CoreData – przetwarzanie dużej ilości danych

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.

Be Sociable, Share!