2011-01-18 11 views
6

Uso el ABAddressBook en mi aplicación.
El acceso al AB proviene de un hilo separado para liberar la interfaz de usuario.
Soy consciente del hecho de que el acceso a la instancia AB tiene que ser del mismo hilo todo el tiempo y he creado un contenedor por este motivo.
El contenedor es un singleton y mantiene su propio hilo de fondo.
Todos los mensajes que llegan a la envoltura se redirigen automáticamente al hilo de fondo, mientras que el hilo de llamada espera hasta el final de la implementación y al final rellena el argumento de salida con los datos relevantes (lista de contactos, un contacto específico, etc.) .iPhone: la libreta de direcciones se borra a veces

Aunque, a veces, la libreta de direcciones en el dispositivo se vacía (se borra).
Después de cada 10-20-ésima utilización de la aplicación.

lo tanto, tengo algunas preguntas:

  • Después de obtener el ABRecordRef del AB en el hilo dedicado tengo para recuperar datos de la ABRecordRef también en el mismo hilo o puede ser otro hilo? También tengo un contenedor para ABRecordRef, así que cuando recupero un contacto de AB, llené el objeto envoltorio de persona y luego lo uso (leo de ABRecordRef) desde el hilo original.
  • Cuando uso las API AB UI (controlador de navegación del selector de persona, controlador de vista de persona nuevo, etc.) y les paso mi instancia de ABAddressBook, tengo que preocuparme por el hecho de que la API no usará esta instancia AB del mismo hilo que lo creó? He visto que puedo pasar NULL en lugar de la instancia AB y luego la API usará su propia AB, pero ¿qué puedo hacer cuando quiero modificar un contacto? En este caso, tengo que pasarle la instancia ABRecordRef ...
  • ¿Hay algo más en lo que no pensé?

Gracias de antemano.

-
Michael

Respuesta

4

Sólo debe acceder a la libreta de direcciones desde el mismo hilo que llama ABAddressBookCreate(). No puede usar ABRecordRef en otro hilo. Solo los datos de identificación y copiados son seguros para pasar entre hilos.

Normalmente, creo una cola de envío en serie y la utilizo como un contenedor para las llamadas a la libreta de direcciones que no pueden bloquear el hilo principal.

Cuando usa la IU, necesita llamar a ABAddressBookCreate() en el hilo principal y usar eso para sus llamadas de IU.

Si necesita modificar un contacto con la interfaz de usuario, debe modificar el contacto, guardarlo, luego actualizar la libreta de direcciones en su hilo de fondo o cola, de modo que contenga los últimos cambios. Hay una notificación de devolución de llamada ABAddressBookRegisterExternalChangeCallback, para este propósito.

Cuestiones relacionadas