Адресная книга возвращает старые значения

У меня проблема с фреймворком AddressBook. Кажется, все это происходит из-за того, что ABCopyRecordForUniqueId возвращает запись со старыми данными.

Пример:

Я запускаю приведенную ниже программу в одном окне терминала - она ​​показывает текущие данные.

Я вношу изменения в пользовательском интерфейсе адресной книги - моя программа продолжает показывать старые данные.

Я запускаю другой экземпляр той же программы в новом окне терминала - он показывает обновленные данные.

Я безуспешно пробовал размещать сообщения на сайте омнигруппы :( так что любые рекомендации действительно приветствуются

PS: Если вы хотите попробовать код, чтобы получить идентификатор адресной книги, вы можете экспортировать контакт как vCard и открыть его с помощью текстового редактора.

int main (int argc, const char * argv[])
{   
ABAddressBookRef addressBook = ABGetSharedAddressBook();

while(1)
{
    ABRecordRef addressBookRecord = NULL;

    addressBookRecord = ABCopyRecordForUniqueId(addressBook, CFSTR("4064D587-0378-4DCF-A6B9-D3702F01C94C:ABPerson"));
    CFShow(addressBookRecord);

    CFRelease(addressBookRecord);

    sleep(1);
}

return 0;
}

person Marcus Wood    schedule 12.11.2009    source источник


Ответы (2)


Я сам пробовал ваш пример и вижу ту же проблему. Из любопытства я попытался запросить общую адресную книгу внутри цикла (на случай, если с синглтоном адресной книги что-то не так), но это не имело значения. Я проверил документацию (справочник по ABAddressBook C), а также справочник и руководство по структуре адресной книги более высокого уровня. Насколько я могу судить, вы поступаете правильно.

Я бы зарегистрировал это как ошибку фреймворка.

person Joshua Nozzi    schedule 13.11.2009

спасибо за предложение. Я подал отчет, но оказалось, что это ожидаемо

Раздражает, что этого не было в документации ..

"Разработчики определили, что эта проблема работает должным образом, на основании следующей информации:

Адресная книга требует запуска цикла выполнения для получения обновлений от других приложений. Вместо сна (1) используйте CFRunLoopRunInMode (kCFRunLoopDefaultMode, 1.0, false) ».

Спасибо, М

person Marcus Wood    schedule 19.11.2009