2011-01-18 2 views
6

ABAddressBook을 내 앱에서 사용합니다.
AB에 대한 액세스는 UI를 릴리스하기 위해 별도의 스레드에서 수행됩니다.
AB 인스턴스에 대한 액세스가 항상 동일한 스레드에서 이루어져야한다는 사실을 알고 있으며 이러한 이유로 래퍼를 작성했습니다.
래퍼는 싱글 톤이며 고유 한 백그라운드 스레드를 유지합니다.
래퍼로 들어오는 모든 메시지는 백그라운드 스레드로 자동으로 리디렉션됩니다. 호출하는 스레드는 구현이 끝날 때까지 대기하고 결국 out 인수를 관련 데이터 (연락처 목록, 특정 연락처 등)로 채 웁니다. .iPhone : 주소록이 때때로 지워집니다.

비록 장치의 주소록이 때때로 비어 있습니다 (지워집니다).
10-20 회마다 앱을 사용할 때마다

그래서, 나는 몇 가지 질문이 있습니다

  • 나는 전용 스레드에서 AB에서 ABRecordRef을 얻을 후 나는 같은 스레드에서 또한 ABRecordRef에서 데이터를 검색해야하거나 다른 스레드 할 수 있습니까? 또한 ABRecordRef에 대한 래퍼가 있으므로 AB에서 연락처를 검색 할 때 사람 래퍼 개체를 채운 후 원래 스레드에서 (ABRecordRef에서 읽음) 사용합니다.
  • AB UI API (사람 선택 컨트롤러, 새로운 사람보기 컨트롤러 등)를 사용하고 ABAddressBook의 인스턴스를 전달할 때 API에서이 AB 인스턴스를 사용하지 않는다는 사실에 대해 걱정해야합니까? 그것을 만든 동일한 스레드? 나는 AB 인스턴스 대신에 NULL을 전달할 수 있고 API는 자체 AB를 사용하는 것을 보았습니다.하지만 연락처를 수정할 때 어떻게해야합니까? 이 경우 ABRecordRef 인스턴스를 전달해야합니다 ...
  • 내가 생각하지 못한 다른 것이 있습니까?

감사합니다.

-
마이클

답변

4

당신은() ABAddressBookCreate라는 동일한 스레드에서 주소록에 액세스해야합니다. 다른 스레드에서는 ABRecordRef를 사용할 수 없습니다. 레코드 ID와 복사 된 데이터 만 스레드간에 안전하게 전달됩니다.

일반적으로 직렬 디스패치 큐를 만들고이를 주 스레드를 차단할 수없는 주소록 호출에 대한 래퍼로 사용합니다.

UI를 사용할 때 기본 스레드에서 ABAddressBookCreate()를 호출하고 UI 호출에이를 사용해야합니다.

UI로 대화 상대를 수정해야하는 경우 연락처를 수정하고 저장 한 다음 백그라운드 스레드 또는 대기열의 주소록을 업데이트하여 최신 변경 내용을 포함하도록합니다. 이를 위해 알림 콜백 ABAddressBookRegisterExternalChangeCallback이 있습니다.