ABPersonCopyImageDataWithFormat删除联系人图像

时间:2013-03-17 07:29:38

标签: iphone ios objective-c addressbook abaddressbook

我有这个代码将所有联系人图像存储在字典中。但是,在某些情况下,当它被中断时,联系人的图像就会消失。

dispatch_async(dispatch_get_main_queue(), ^{            

        if (ABPersonHasImageData(_personObj)) {

            // UIImage *image = [UIImage imageWithData:(__bridge NSData*) ABPersonCopyImageDataWithFormat(_personObj, kABPersonImageFormatThumbnail)];
            NSData *data = (__bridge NSData *) ABPersonCopyImageDataWithFormat(_personObj, kABPersonImageFormatThumbnail);
            UIImage *image = [UIImage imageWithData:data scale:1];
            int recordId = ABRecordGetRecordID(_personObj);
            [contactImagesDi setValue:image forKey:[NSNumber numberWithInt:recordId]];

        }

});

1 个答案:

答案 0 :(得分:6)

单个ABPerson不是线程安全的。您无法使用ABPersondispatch_async()传递给后台队列。如果要进行后台处理,则必须在每个线程上生成一个新的ABAddressBook,并使用该线程上从该通讯录中提取的ABPerson个记录。

如果您需要在线程之间逻辑传递ABPerson,则需要使用ABRecordGetRecordID()获取其ID。您可以使用ABPerson传递该内容并在另一个线程(使用自己的地址簿)上重新构建新的ABAddressBookGetPersonWithRecordID()记录。

@try / @catch在ObjC中非常罕见,你应该有充分的理由这样做。在ARC下,您通常会泄漏内存。例外意味着该程序出现问题并且很快就会崩溃。

您正在泄露data。您应该在CFBridgingRelease()使用__bridge,而不是Copy。您需要平衡contactImagesDi

您对NSMutableDictionary的修改非常危险,假设这是一本字典。 dispatch_async不是线程安全的。如果它是您正在使用KVC的对象,那么它可能是线程安全的,但前提是您已经采取了一些措施来确保这一点。通常,更好的解决方案是使用{{1}}将这种更新重新放回主线程。