Tôi có một ứng dụng thỉnh thoảng bị treo do mảng được trả về bởi ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering() có kích thước khác với ABAddressBookGetPersonCount(). Vỏ mã được hiển thị bên dưới. Thông thường nPeople có cùng kích thước với mảng. Tuy nhiên, trên iPhone của một người dùng (hoặc ít nhất, theo báo cáo của một người dùng), nPeople gần như gấp đôi. Tôi có thể dừng sự cố bằng cách sử dụng kích thước mảng, thay vì ABAddressBookGetPersonCount(). Tuy nhiên, tôi không chắc chắn nếu điều này có nghĩa là tôi không truy cập tất cả Danh bạ trong iPhone.ABAddressBookCopyArrayOfAllPeople và ABAddressBookGetPersonCount trả về các kích thước khác nhau
- Có ai gặp vấn đề này trước đây không?
- Tại sao các con số lại khác?
Tôi tự hỏi nếu nó liên quan đến các liên hệ được lưu trữ trong Groups (Tôi không biết rằng có các nhóm - chỉ là một ý tưởng). Ngoài ra, từ địa chỉ email của người dùng, tôi nghi ngờ họ sử dụng MobileMe. Tôi tự hỏi nếu đồng bộ hóa với MobileMe sẽ tạo bản sao với một recordId khác, nhưng không xóa liên hệ hiện tại, ít nhất là không xa như ABAddressBookGetPersonCount() đi.
EDIT: Tôi đã xem xét điều này một số chi tiết và có ý tưởng khá tốt về nguyên nhân của vấn đề. Khi tôi muốn một mảng sắp xếp các liên hệ, tôi đã sử dụng ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering(). Điều này yêu cầu nguồn sổ địa chỉ - tôi đã sử dụng nguồn mặc định. Tôi tin rằng có thể có nhiều nguồn khác nhau - nguồn địa phương cộng với các nguồn khác như Exchange và MobileMe. Vì vậy, mảng của tôi sẽ kết thúc chỉ với các địa chỉ liên lạc địa phương, trong khi số được trả về bởi ABAddressBookGetPersonCount() sẽ bao gồm tất cả các nguồn - vì thế sự cố của tôi. Do đó, tôi nghĩ sẽ tốt hơn nếu chỉ làm việc với dữ liệu cục bộ trong ứng dụng của tôi và sử dụng kích thước mảng được trả về bởi ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering thay vì ABAddressBookGetPersonCount.
CFArrayRef allPeople = InSourceWithSortOrdering(addressBook, source, kABPersonSortByLastName);
CFIndex nPeople = ABAddressBookGetPersonCount(addressBook);
for (int i = 0; i < nPeople; i++)
{
ABRecordRef ref = CFArrayGetValueAtIndex(allPeople, i);
}
có nghĩa là ABAddressBookGetPersonCount phải luôn nhỏ hơn ABAddressBookCopyArrayOfAllPeople? –
Nó phụ thuộc. Nó sẽ khác nếu cùng một người có thể có thêm hồ sơ. Nếu mọi người có một số liên lạc. Sau đó cả hai sẽ giống nhau. :) @NikitaP –