【发布时间】:2015-08-19 20:30:38
【问题描述】:
我正在使用 ABAddressBook,我可以显示每个联系人,但我有一些重复的联系人。
我已阅读此主题:Dealing with duplicate contacts due to linked cards in iOS' Address Book API,但无法解决问题。
我想在我的中使用此代码,但我没有成功..:
NSMutableSet *unifiedRecordsSet = [NSMutableSet set];
ABAddressBookRef addressBook = ABAddressBookCreate();
CFArrayRef records = ABAddressBookCopyArrayOfAllPeople(addressBook);
for (CFIndex i = 0; i < CFArrayGetCount(records); i++)
{
NSMutableSet *contactSet = [NSMutableSet set];
ABRecordRef record = CFArrayGetValueAtIndex(records, i);
[contactSet addObject:(__bridge id)record];
NSArray *linkedRecordsArray = (__bridge NSArray *)ABPersonCopyArrayOfAllLinkedPeople(record);
[contactSet addObjectsFromArray:linkedRecordsArray];
// Your own custom "unified record" class (or just an NSSet!)
DAUnifiedRecord *unifiedRecord = [[DAUnifiedRecord alloc] initWithRecords:contactSet];
[unifiedRecordsSet addObject:unifiedRecord];
CFRelease(record);
}
CFRelease(records);
CFRelease(addressBook);
_unifiedRecords = [unifiedRecordsSet allObjects];
这是我的代码:
- (void)getPersonOutOfAddressBook
{
//1
CFErrorRef error = NULL;
ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error);
if (addressBook != nil) {
NSLog(@"Succesful.");
//2
NSArray *allContacts = (__bridge_transfer NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBook);
//3
NSUInteger i = 0; for (i = 0; i < [allContacts count]; i++)
{
Person *person = [[Person alloc] init];
ABRecordRef contactPerson = (__bridge ABRecordRef)allContacts[i];
//4
NSString *firstName = (__bridge_transfer NSString *)ABRecordCopyValue(contactPerson,
kABPersonFirstNameProperty);
if (firstName == nil)
{
firstName = @"";
}
NSString *lastName = (__bridge_transfer NSString *)ABRecordCopyValue(contactPerson, kABPersonLastNameProperty);
if (lastName == nil)
{
lastName = @"";
}
NSString *fullName = [NSString stringWithFormat:@"%@ %@", firstName, lastName];
person.firstName = firstName; person.lastName = lastName;
person.fullName = fullName;
//phone
//5
ABMultiValueRef phones = ABRecordCopyValue(contactPerson, kABPersonPhoneProperty);
//6
NSUInteger j = 0;
for (j = 0; j < ABMultiValueGetCount(phones); j++) {
NSString *phone = (__bridge_transfer NSString *)ABMultiValueCopyValueAtIndex(phones, j);
if (j == 0) {
person.mainNumber = phone;
}
else if (j==1) person.secondNumber = phone;
}
//7
[person.mainNumber stringByReplacingOccurrencesOfString:@" " withString:@""];
[person.mainNumber stringByReplacingOccurrencesOfString:@"(" withString:@""];
[person.mainNumber stringByReplacingOccurrencesOfString:@")" withString:@""];
[person.mainNumber stringByReplacingOccurrencesOfString:@"+336" withString:@"06"];
[self.tableData addObject:person];
[self.contact addObject:person.fullName];
}
//8
CFRelease(addressBook);
} else {
//9
NSLog(@"Error reading Address Book");
}
NSSortDescriptor *sorter = [[NSSortDescriptor alloc] initWithKey:@"fullName" ascending:YES];
[self.tableData sortUsingDescriptors:[NSArray arrayWithObject:sorter]];
}
【问题讨论】:
-
不相关,但是虽然您已经修复了原版的一些内存泄漏,但引入了您自己的一个:您必须
CFRelease(phones)。此外,您在主电话号码中进行了一些字符串替换,但没有对这些替换做任何事情,将它们丢弃。如果你想这样做,可变字符串可能是有意义的。 -
@Rob 我又遇到了一些问题,我使用 self.contact (NSMutableArray) 仅添加 fullName 以便按部分进行排序。我更新了我的代码以向您展示这一点。我不知道如何仅使用 ViewDidLoad 中的 self.tableData 进行修复。对于localizedCaseInsensitiveCompare,我只需要访问person.fullName
-
@Rob 好的,完成。非常感谢您的帮助!!!
标签: ios objective-c nsarray abaddressbook nsset