2011-09-19 43 views
6

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); 
    } 

Trả lời

13

ABAddressBookGetPersonCountABAddressBookCopyArrayOfAllPeople cho mảng khác nhau.

ABAddressBookGetPersonCount - Trả về số lượng bản ghi người trong sổ địa chỉ. ABAddressBookCopyArrayOfAllPeople - Trả về tất cả bản ghi của người trong sổ địa chỉ.

Vì vậy, đôi khi cùng một người có thể có thêm hồ sơ. Đó là lý do tại sao bạn có thể nhận được các kích cỡ khác nhau.

+0

có nghĩa là ABAddressBookGetPersonCount phải luôn nhỏ hơn ABAddressBookCopyArrayOfAllPeople? –

+0

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 –

9

Tôi gặp vấn đề này ngay hôm nay. Ứng dụng của tôi cũng bị treo trong một số iDevices đặc biệt.

mã:

ABRecordRef source = ABAddressBookCopyDefaultSource(addressBook); 
    CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering(addressBook, source, kABPersonSortByLastName); 

    CFIndex nPeople = ABAddressBookGetPersonCount(addressBook); 

    for (int i = 0; i < nPeople; i++) { 
     ABRecordRef person = CFArrayGetValueAtIndex(allPeople, i); 
     // more thing with `person` 
    } 

Nhưng nó sẽ sụp đổ đôi khi. Thêm một số điểm ngắt tôi nhận thấy số của allPeople nhỏ hơn nPeople.

Bằng cách googling, tôi đã tìm thấy this article. Tôi thấy rằng có thể có điều gì đó sai với ABAddressBookCopyDefaultSource. Ở đây tôi nhận được nguồn mặc định, tôi phải thay đổi tất cả các nguồn.

mã:

CFArrayRef sources = ABAddressBookCopyArrayOfAllSources(addressBook); 

CFIndex sourceCount = CFArrayGetCount(sources); 

for (CFIndex i = 0; i < sourceCount; i++) { 
    ABRecordRef currentSource = CFArrayGetValueAtIndex(source, i); 
    int sourceType = [(__bridge NSNumber *)ABRecordCopyValue(currentSource, kABSourceTypeProperty) intValue]; 
    switch (sourceType) { 

     case kABSourceTypeCardDAV: 
      NSLog(@"kABSourceTypeCardDAV"); 
      break; 

     case kABSourceTypeCardDAVSearch: 
      NSLog(@"kABSourceTypeCardDAVSearch"); 
      break; 

     case kABSourceTypeExchange: 
      NSLog(@"kABSourceTypeExchange"); 
      break; 

     case kABSourceTypeExchangeGAL: 
      NSLog(@"kABSourceTypeExchangeGAL"); 
      break; 

     case kABSourceTypeLDAP: 
      NSLog(@"kABSourceTypeLDAP"); 
      break; 

     case kABSourceTypeLocal: 
      NSLog(@"kABSourceTypeLocal"); 
      break; 

     case kABSourceTypeMobileMe: 
      NSLog(@"kABSourceTypeMobileMe"); 
      break; 

     default: 
      break; 
    } 
    CFArrayRef allPeopleInSource = ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering(addressBook, currentSource, kABPersonSortByLastName); 
    NSLog(@"Count of allPeopleInSource: %i", CFArrayGetCount(allPeopleInSource)); 
} 

Sau đó, tôi đã

kABSourceTypeCardDAV 
    Count of allPeopleInSource: 7 

có nghĩa là chỉ có một nguồn và chỉ có 7 bản ghi trong nguồn đó.

Nhưng trong sổ địa chỉ của tôi, tôi có 79 liên hệ!

Sau đó, tôi đã phạm sai lầm. Tôi đã thông qua sources-ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering, chỉ cần như thế này:

CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering(addressBook, sources, kABPersonSortByLastName); 

Có bao nhiêu thành viên trong allPeople?

72 !!!

Chính xác tổng số bản ghi không nằm trong số sources.

Tôi đã chuyển CFArrayRef thành ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering làm thông số thứ hai, dự kiến ​​ABRecordRef. Nếu tôi vượt qua nil thì sao?

Cuối cùng, tôi nhận được các mã:

CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering(addressBook, nil, kABPersonSortByLastName); 

    CFIndex nPeople = ABAddressBookGetPersonCount(addressBook); 

    for (int i = 0; i < nPeople; i++) { 
     ABRecordRef person = CFArrayGetValueAtIndex(allPeople, i); 
     // more thing with `person` 
    } 

Bây giờ tôi có thể nhận được tất cả các địa chỉ liên lạc trong sổ địa chỉ của tôi.

Nó hoạt động tốt trên tất cả các thiết bị iDevices của tôi!

Tôi rất tiếc về tiếng anh nghèo của tôi ...

Hy vọng câu trả lời này có thể giúp bạn.

Note: Bây giờ tôi không hiểu là gì source trong AddressBook chính xác, Ai có thể giúp tôi?

+0

Câu trả lời hay. Đôi khi tất cả các địa chỉ liên lạc trong sổ địa chỉ của bạn có thể không phải từ một nguồn. Nó có thể được từ Facebook, gmails khác nhau vv .. Vì vậy, nếu bạn không chỉ định một nguồn bạn nhận được tất cả các địa chỉ liên lạc. – Kaey

Các vấn đề liên quan