2010-06-21 35 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

相關問題