我已编写如下代码,用于从地址簿中删除所有联系人。但对于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];
}
答案 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);