2010-06-21 8 views
1

J'ai écrit du code comme ci-dessous pour supprimer tous les contacts du carnet d'adresses. Mais cela fonctionne très lentement pour plus de 1000 contacts. existe-t-il un autre moyen de supprimer tous les contacts du carnet d'adresses. J'ai besoin de cela pour restaurer la sauvegarde dans mon application.Comment supprimer efficacement tous les contacts de AddressBook en utilisant le framework 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]; 
} 

Répondre

3

Vous pourriez commencer par ne récupérer le peuple du livre une fois pour toute la boucle au lieu de deux fois par itération, et d'améliorer encore cela en boucle directement sur le tableau à l'aide fast enumeration au lieu d'accéder à des objets par index:

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

Vous devez également profiler votre application dans Instruments pour voir ce qui pourrait prendre une partie importante de votre temps. Je prédis-mais vous devriez le confirmer vous-même-que si vous profilez votre code actuel, [book people] apparaîtra comme un point chaud parce que vous l'appelez tellement (2000 fois quand count == 1000).

(Je suppose que vous avez une bonne raison d'être vider le carnet d'adresses ...)

+0

Salut Peter, Votre logique ont supprimé 1000 contacts en seulement 5 secondes. C'est bien. Merci pour votre réponse. Par le code que j'ai posté prend autant de temps pour supprimer les contacts. J'ai besoin de cela pour restaurer la sauvegarde du serveur. Merci encore. –

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

Parfait, ça m'aide. + 1 pour une bonne réponse. – Shivaay

Questions connexes