如何使用AddressBook框架有效地从AddressBook中删除所有联系人?

时间:2010-06-21 09:54:49

标签: objective-c cocoa 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];
}

2 个答案:

答案 0 :(得分:3)

你可以先从整个循环中检索一次本书的人,而不是每次迭代检索两次,并通过使用fast enumeration直接在数组上循环而不是按索引访问对象来进一步改进这一点:

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

您还应该在“工具”中对您的应用进行分析,看看还有什么可能占用您的大部分时间。我预测 - 但你应该自己确认一下 - 如果你描述了当前的代码,[book people]会显示为一个热点,因为你这么称呼它(count == 1000时的2000次)。 / p>

(我假设你有充分的理由清空地址簿......)

答案 1 :(得分:3)

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);