Debata pomiędzy GCD i NSOperation
w zasadzie sprowadza się do argumentu używając najwyższy poziom abstrakcji, który zapewnia dobre rozwiązanie.
NSOperationQueue
jest zbudowany na górze GCD, więc musi być wyższy poziom abstrakcji.
Jednak GCD jest tak łatwy w użyciu w ogólnym przypadku, że uważam, że w wielu przypadkach jest lepsze od NSOperationQueue
.
Teraz, gdy wprowadzisz CoreData do miksu, proponuję trzecią alternatywę. Jeśli używasz iOS 5, możesz użyć współbieżności prywatnej kolejki ze swoim MOC. Uważam, że jest to dobra abstrakcja i zapewnia łatwy w użyciu interfejs.
Proponuję Ci po prostu utworzyć MOC z NSPrivateQueueConcurrencyType
dla każdego wątku, w którym chcesz wykonywać Dane Rdzenia. Możesz wybrać, w zależności od właściwości aplikacji, czy udostępnić numer persistentStoreCoordinator
, lub użyć oddzielnego. Można nawet użyć kontekstów zagnieżdżonych (z zastrzeżeniem dla strony wstawiania).
Zasadniczo wynika ten model ...
NSManagedObjectContext *moc = [[NSManagedObjectCotext alloc] initWithConcurrencyType:NSPrivateQueuqConcurrencyType];
moc.parentContext = contextIWantToBeParent;
moc.persistentStoreCoordinator = pscIWant;
[moc performBlock:^{
// Your MOC stuff running on its own private queue
}];
oczywiście, należy wybrać jedną z metod (zarówno dla rodziców do istniejącego MOC lub dołączenie do PSC).
Generalnie preferuję metodę performBlock
.
EDIT
Dzięki. Czytałem, że NSManagedObject nie jest bezpieczny dla wątków. Jak utworzyć nowe obiekty NSManagedObjects w tej prywatnej kolejce? - Helium3
Tak, to prawda. Jednak podczas tworzenia MOC z typem współbieżności, zgadzasz się na umowę, która ma coś takiego.
I, bystry programista, uroczyście wyrażają zgodę na następujące podstawowe dane Przepisów dotyczących współbieżności:
Jeśli użyję NSConfinementConcurrencyType
będę używać go tylko wtedy, gdy działa na wątku, który go stworzył.
Jeśli użyję NSPrivateQueueConcurrencyType
, użyję MOC tylko z poziomu performBlock
lub performBlockAndWait
.
Jeśli użyję NSMainQueueConcurrencyType
będę używać tylko MOC od wewnątrz obu performBlock
, performBlockAndWait
lub gdy wiem, że używam na głównym wątku.
Jeśli zastosujesz się do tych zasad, będziesz mógł użyć MOC na innych wątkach.
W szczególności przy użyciu performBlock
, interfejs Core Data API upewni się, że kod jest odpowiednio zsynchronizowany.
Dzięki. Czytałem, że NSManagedObject nie jest bezpieczny dla wątków. Jak utworzyć nowe obiekty NSManagedObjects w tej prywatnej kolejce? – jarryd
Dzięki za edycję. Więc jeśli NSManageObjects są dodawane do sklepu lub edytowane przez MOC z współbieżnością, nie ma potrzeby ręcznego synchronizowania sklepu? – jarryd
Przepraszam, nie podałem tego pytania. –