Как эффективно удалить все контакты из AddressBook с помощью фреймворка AddressBook?

Я написал код, как показано ниже, для удаления всех контактов из адресной книги. Но он работает очень медленно для более чем 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];
}

person Hiren Gujarati    schedule 21.06.2010    source источник


Ответы (2)


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

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

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

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

person Peter Hosey    schedule 21.06.2010
comment
Привет, Питер, Ваша логика удалила 1000 контактов всего за 5 секунд. Отлично. Спасибо за Ваш ответ. Судя по коду, который я выложил, удаление контактов занимает очень много времени. Мне это нужно для восстановления резервной копии с сервера. Еще раз спасибо. - person Hiren Gujarati; 22.06.2010

person    schedule
comment
Отлично, это помогает мне. +1 за хороший ответ. - person Kundan; 30.01.2014