2009-09-21 10 views
14

W dokumentacji Core Data firmy Apple dla Concurrency with Core Data, wymieniają one preferowaną metodę dla bezpieczeństwa wątków, używając osobnego NSManagedObjectContext na wątek, z udostępnionym NSPersistentStoreCoordinator.Wielowątkowe użycie danych podstawowych (NSOperationQueue i NSManagedObjectContext)

Jeśli mam kilka NSSperations uruchomionych jeden po drugim na NSOperationQueue, czy będzie duży narzut, tworząc kontekst z każdym zadaniem?

W przypadku parametru NSOperationQueue o maksymalnej liczbie równoczesnych operacji równej 1 wiele z moich operacji będzie używać tego samego wątku. Czy mogę używać słownika wątku do utworzenia jednego NSManagedObjectContext na wątek? Jeśli to zrobię, czy będę miał problemy z późniejszym oczyszczeniem moich kontekstów?

Jaki jest poprawny sposób korzystania z danych podstawowych w tym przypadku?

Odpowiedz

19

Prawidłowy sposób na wykorzystanie danych Core w tym przypadku jest stworzenie oddzielnego NSManagedObjectContext za działania lub mieć jeden kontekst, który go zablokować (przez -[NSManagedObjectContext lock] przed użyciem i po użyciu -[NSManagedObjectContext unlock]). Zablokowane podejście może mieć sens, jeśli operacje są szeregowe i nie ma innych wątków używających kontekstu.

Które podejście do użycia jest empirycznym pytaniem, na które nie można odpowiedzieć bez danych. Istnieje zbyt wiele zmiennych, aby mieć ogólną regułę. Twarde liczby z testów wydajności są jedynym sposobem na podjęcie świadomej decyzji.

+1

FYI - 'lock' i' unlock' są przestarzałe w iOS8 i OSX 10.10. Rekomendacją jest: "Użyj kontekstu stylu kolejki i -performBlockAndWait: zamiast" –

2

Operacje rozpoczęte z użyciem NSOperationQueue przy maksymalnej liczbie równoczesnych operacji wynoszącej 1 nie będą wykonywać wszystkich operacji w tym samym wątku. Operacje będą wykonywane jeden po drugim, ale za każdym razem zostanie utworzony nowy wątek.

Tworzenie obiektów w słowniku słownika będzie mało przydatne.

+2

Nie ma gwarancji, że za każdym razem będzie to nowy wątek. W rzeczywistości w systemie Snow Leopard NSOperationQueue korzysta z Grand Central Dispatch, która jawnie wykorzystuje wątki. –

+0

To pytanie dotyczy iPhone'a, a nie Snow Leopard. I oczywiście nie ma ** gwarancji **, czy kiedykolwiek? –

2

Podczas gdy to pytanie jest stare, jest ono na samym początku wyników wyszukiwania Google w "wątku NSMangedObjectContext", więc po prostu dostanę nową odpowiedź.

Nowa "preferowana" metoda polega na użyciu initWithConcurrencyType: i powiedz MOC czy jest to główny wątek MOC lub wątek dodatkowy moc. Następnie można użyć nowych metod performBlock: i performBlockAndWait: MOC zajmie się serializacją operacji na "natywnym" wątku.

Problem polega na tym, jak inteligentnie radzić sobie z łączeniem danych między różnymi MOC-ami, w których może pojawić się twoja aplikacja, oraz tysiącem innych szczegółów, które czynią życie "zabawnym" jako programistą.

Powiązane problemy