2011-01-18 26 views
6

Używam ABAddressBook w mojej aplikacji.
Dostęp do AB odbywa się z osobnego wątku w celu zwolnienia interfejsu użytkownika.
Jestem świadomy faktu, że dostęp do instancji AB musi być z tego samego wątku przez cały czas i dlatego zbudowałem opakowanie z tego powodu.
Opakowanie jest singletonem i zachowuje swój własny wątek tła.
Wszystkie wiadomości przychodzące do opakowania są automatycznie przekierowywane do wątku w tle, podczas gdy wątek wywołujący czeka aż do końca implementacji, a na końcu wypełnia argument z odpowiednimi danymi (lista kontaktów, konkretny kontakt itp.) .iPhone: książka adresowa jest czasami kasowana

Mimo to książka adresowa na urządzeniu jest czasami pusta (usuwana).
Po każdych 10-20 godzinach korzystania z aplikacji.

Tak, mam kilka pytań:

  • Po otrzymuję ABRecordRef z AB w dedykowanym wątku muszę odzyskać dane z ABRecordRef również w tym samym wątku lub może to być inny wątek? Posiadam również wrapper dla ABRecordRef, więc po pobraniu kontaktu z AB wypełniam obiekt wrappera osoby, a następnie używam go (czytanego z ABRecordRef) z oryginalnego wątku.
  • Kiedy używam interfejsów API AB UI (kontroler nawigatora osoby, nowy kontroler widoku osoby itp.) I przekazuję je mojej instancji ABAddressBook, muszę się martwić faktem, że API nie użyje tej instancji AB z ten sam wątek, który je utworzył? Widziałem, że mogę przekazać NULL zamiast wystąpienia AB, a następnie API użyje własnego AB, ale co mogę zrobić, gdy chcę zmodyfikować kontakt? W takim przypadku muszę przekazać to instancji ABRecordRef ...
  • Czy jest jeszcze coś, o czym nie myślałem?

Z góry dziękuję.

-
Michael

Odpowiedz

4

Musisz tylko otworzyć książkę adresową z tego samego wątku, który wywołał ABAddressBookCreate(). Nie możesz użyć ABRecordRef w innym wątku. Tylko nagrania i skopiowane dane można bezpiecznie przenosić między wątkami.

Zazwyczaj utworzę kolejkę wywołania szeregowego i używam jej jako opakowania dla wywołań książki adresowej, która nie może zablokować głównego wątku.

Podczas korzystania z interfejsu użytkownika należy wywołać funkcję ABAddressBookCreate() w głównym wątku i użyć jej w przypadku wywołań interfejsu użytkownika.

Jeśli chcesz zmodyfikować kontakt za pomocą interfejsu użytkownika, zmodyfikuj kontakt, zapisz go, a następnie zaktualizuj książkę adresową w wątku lub kolejce tła, tak aby zawierał najnowsze zmiany. W tym celu jest wywołanie zwrotne ABAddressBookRegisterExternalChangeCallback.

Powiązane problemy