Mam aplikację, która czasami się zawiesza z powodu tablicy zwróconej przez ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering() o innym rozmiarze niż ABAddressBookGetPersonCount(). Powłoka kodu jest pokazana poniżej. Zazwyczaj nPeople ma taki sam rozmiar jak tablica. Jednak na iPhonie jednego użytkownika (lub przynajmniej według jednego użytkownika) nPeople jest prawie dwa razy większy. Mogę zatrzymać awarię za pomocą rozmiaru tablicy, a nie ABAddressBookGetPersonCount(). Jednak nie jestem pewien, czy oznacza to, że nie mam dostępu do wszystkich kontaktów w telefonie iPhone.ABAddressBookCopyArrayOfAllPeople i ABAddressBookGetPersonCount zwracają różne rozmiary
- Czy ktoś już wcześniej napotkał ten problem?
- Dlaczego liczby byłyby różne?
Zastanawiałem się, czy miało to coś wspólnego z kontaktami przechowywanymi w Grupach (nie wiem, czy istnieją grupy - po prostu pomysł). Również z adresu e-mail użytkownika podejrzewam, że używają MobileMe. Zastanawiałem się, czy synchronizacja z MobileMe spowoduje utworzenie duplikatów z innym rekordem, ale nie usunie istniejącego kontaktu, przynajmniej jeśli chodzi o ABAddressBookGetPersonCount().
EDYCJA: Zajrzałem do tego więcej i mam dość dobry pomysł na przyczynę problemu. Ponieważ chciałem posortowane tablice kontaktów, użyłem ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering(). Wymaga to źródła książki adresowej - użyłem domyślnego źródła. Wierzę, że mogą istnieć różne źródła - lokalne źródła i inne, takie jak Exchange i MobileMe. W związku z tym moja tablica będzie zawierała tylko lokalne kontakty, podczas gdy liczba zwrócona przez ABAddressBookGetPersonCount() będzie zawierać wszystkie źródła - stąd moja awaria. Dlatego uważam, że lepiej byłoby po prostu pracować z lokalnymi danymi w mojej aplikacji i użyć rozmiaru tablicy zwróconego przez ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering zamiast ABAddressBookGetPersonCount.
CFArrayRef allPeople = InSourceWithSortOrdering(addressBook, source, kABPersonSortByLastName);
CFIndex nPeople = ABAddressBookGetPersonCount(addressBook);
for (int i = 0; i < nPeople; i++)
{
ABRecordRef ref = CFArrayGetValueAtIndex(allPeople, i);
}
oznacza to, że ABAddressBookGetPersonCount powinien być zawsze mniejszy niż ABAddressBookCopyArrayOfAllPeople? –
To zależy. Będzie inaczej, jeśli ta sama osoba może mieć dodatkowe rekordy. Jeśli każda osoba ma jeden numer kontaktowy. Wtedy oba będą takie same. :) @NikitaP –