2009-07-16 11 views
7

Mój zmysł z dokumentacji książki adresowej i moje zrozumienie podstawowej implementacji CoreData sugeruje, że książka adresowa powinna być bezpieczna dla wątków, a tworzenie zapytań z wielu wątków nie powinno sprawiać żadnych problemów. Ale mam problem ze znalezieniem jakiejkolwiek jawnej dyskusji na temat bezpieczeństwa wątków w dokumentach. To rodzi kilka pytań:Bezpieczeństwo i wydajność wątku w książce adresowej

  • Czy można bezpiecznie używać + sharedAddressBook na wielu wątkach w trybie tylko do odczytu? Uważam, że odpowiedź brzmi "tak".
  • Aby uzyskać dostęp do zapisu w wątkach w tle, wydaje się, że zamiast tego należy użyć + książki adresowej (i zapisać zmiany ręcznie). Czy rozumiem to poprawnie?
  • Czy ktoś badał wpływ na wydajność wykonywania wielu jednoczesnych zapytań do Książki adresowej na wielu wątkach? Powinno to być bardzo podobne do wykonywania wielu zapytań CoreData na wielu wątkach. Mam wrażenie, że niewiele zyskałbym, robiąc równoległe zapytania, ponieważ zakładam, że będą one serializowane, gdy trafią w SQLLite, ale nie jestem tu pewien.

muszę zrobić dziesiątki zapytań (niektóre złożone) przeciwko adresową i robie tak na wątek tła przy użyciu NSOperation aby uniknąć blokowania UI (który obecnie robi). Moje podstawowe pytanie brzmi: czy sensownym jest ustawienie maksymalnych równoczesnych operacji na wartość większą niż 1 i czy istnieje jakiekolwiek niebezpieczeństwo, jeśli aplikacja może jednocześnie pisać do książki adresowej w innym wątku.

+0

Fakt, że struktura Address Book Framework (nie zawsze tak było) używa Core Data to szczegół implementacji, który należy zignorować i niekoniecznie gwarantuje bezpieczeństwo wątków. Czy można podać łącze do dokumentacji, która mówi, że interfejs API książki adresowej jest bezpieczny dla wątków? Nie mogłem znaleźć polityki dotyczącej wątków podanej w dokumentacji. –

+0

Nie mogę tego również znaleźć. Właśnie o tym mówiłem w pierwszym akapicie. Nie mogę znaleźć żadnych wyraźnych dyskusji na temat gwintowania z AB w jakichkolwiek dokumentach. Ale zakładając, że nie jest bezpieczny dla wątków, powstaje rozległa złożoność, która jest mało prawdopodobna (i nie mogę znaleźć dokumentacji dotyczącej prawidłowego wdrażania), co podnosi pytanie. –

+3

Bez szczególnej gwarancji, że to, lub jej podzbiór, jest bezpieczny dla wątków, musisz być pesymistą i założyć, że tak nie jest. –

Odpowiedz

7

O ile interfejs API nie mówi, że jest bezpieczny dla wątków, nie jest. Nawet jeśli obecna implementacja będzie bezpieczna dla wątków, może nie być dostępna w przyszłości. Innymi słowy, nie używaj AB z wielu wątków.

Odkładając na bok, co z tego, że bazuje na CoreData, uważasz, że byłoby bezpieczne dla wątków? CoreData używa modelu zamknięcia nici, w którym dostęp do kontekstu na pojedynczym wątku jest bezpieczny, wszystkie obiekty z kontekstu muszą być dostępne w tym samym wątku.

Oznacza to, że sharedAddressBook nie będzie bezpieczny dla wątków, jeśli zachowa obiekt NSManagedObjectContext do użycia. Byłoby to bezpieczne tylko wtedy, gdy AB tworzy nowy kontekst za każdym razem, gdy musi coś zrobić i natychmiast go usuwa, lub jeśli tworzy kontekst na wątek i zawsze używa odpowiedniego kontekstu (prawdopodobnie przechowując ref w wątku) . W obu przypadkach nie byłoby bezpiecznie przechowywać niczego jako NSManagedObjects, ponieważ konteksty byłyby stale niszczone, co oznacza, że ​​każdy ABRecord musiałby przechowywać obiekt NSManagedObjectID, aby mógł odtworzyć obiekt w odpowiednim kontekście, gdy był potrzebny.

Oczywiście wszystko to jest możliwe, może to być zrobione, ale nie jest to oczywiste wdrożenie.

+1

Jestem świadomy problemy wątku/kontekstu z CoreData, i dlatego wskazuję na istnienie metody + adresowej książki adresowej .Jeśli nie zapewnia ona oddzielnego kontekstu, jaki jest możliwy cel? (Przyznane, inni zadali to samo pytanie, ponieważ jest ono niejasne z Dokumenty, w jaki sposób + udostępnionyAddressBook i + książka adresowa różnią się.) Połączenie braku bezpieczeństwa wątków, brak mechanizmu blokującego, brak wytycznych co do tego, czy mainThread jest wymagany, i ekstremalnie powolne działanie, podstawowe pytanie wciąż pozostaje: jak poprawnie pisać wysoce responsywnie aplikacje, które wymagają wielu zapytań AB. Czas radaru ... –

Powiązane problemy