Как эффективно удалить все контакты из AddressBook, используя платформу AddressBook? - PullRequest
1 голос
/ 21 июня 2010

Я написал следующий код для удаления всех контактов из адресной книги.Но он работает очень медленно для более чем 1000 контактов.Есть ли другой способ удалить все контакты из адресной книги.Мне это нужно для восстановления резервной копии в моем приложении.

-(void)removeAllData
{   
ABAddressBook *book = [ABAddressBook sharedAddressBook];
int count = [[book people] count];

for(int i=count;i>=0;i--)
{

    if(i<[[book people] count])
    {
        [book removeRecord:[[book people] objectAtIndex:i]];
    }

}

[book save];
}

Ответы [ 2 ]

3 голосов
/ 27 мая 2013
ABAddressBookRef addressBook = ABAddressBookCreate();
CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressBook);

int peopleCount = CFArrayGetCount(allPeople);
CFErrorRef *error = nil;
for (int i = 0; i < peopleCount; i++){
    ABRecordRef person = CFArrayGetValueAtIndex(allPeople, i);
    error = nil;
    ABAddressBookRemoveRecord(addressBook, person, error);
}
error = nil;
ABAddressBookSave(addressBook, error);

CFRelease(allPeople);
CFRelease(addressBook);
3 голосов
/ 21 июня 2010

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

NSArray *people = [book people];
for (ABPerson *person in people)
    [book removeRecord:person];
[book save];

Вы также должны профилировать свое приложение в Инструментах, чтобы увидеть, что еще может занимать значительную часть вашего времени.Я предсказываю - но вы должны это подтвердить сами - что если вы профилируете свой текущий код, [book people] будет отображаться как горячая точка, потому что вы так часто его называете (2000 раз, когда count == 1000).

(Я предполагаю, что у вас есть веская причина для очистки адресной книги ...)

...