2010-06-21 114 views
1

我已经编写了如下的代码,用于从通讯录中删除所有联系人。但是,对于超过1000个联系人来说,它工作得非常缓是否有任何其他方式从通讯录中删除所有联系人。我需要在我的应用程序中恢复备份。如何使用AddressBook框架有效地从AddressBook中删除所有联系人?

-(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]; 
} 

回答

3

您可以通过每次迭代仅检索图书的人曾经为整个循环而不是两次启动,并通过指数直接在阵列上使用fast enumeration循环,而不是访问对象进一步改善这一点:

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

您还应该在乐器中描述您的应用,以查看还有哪些可能会占用您大部分时间。我预测 - 但你应该自己确认一下 - 如果你分析你当前的代码,[book people]将显示为一个热点,因为你这么称呼它(2000时count == 1000)。

(我假设你有一个很好的理由要走光了地址簿......)

+0

彼得你好,你的逻辑都在短短的5秒删除1000个联系人。这很棒。感谢您的回答。通过我发布的代码需要很多时间来删除联系人。我需要从服务器恢复备份。再次感谢。 – 2010-06-22 06:07:23

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

完美,它可以帮助我。+ 1为好的答案。 – Shivaay 2014-01-30 06:21:32

相关问题