2

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

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]];

        }

});
4

1 回答 1

6

单线程ABPerson不是线程安全的。您不能ABPerson使用 将 传递给后台队列dispatch_async()。如果要进行后台处理,则必须ABAddressBook在每个线程上生成一个新的,并ABPerson在该线程上使用从该地址簿中获取的记录。

如果你需要ABPerson在线程之间逻辑传递一个,你需要用ABRecordGetRecordID(). 您可以传递它并ABPerson使用ABAddressBookGetPersonWithRecordID().

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

你在泄漏data。你应该在CFBridgingRelease()这里使用,而不是__bridge. 您需要平衡Copy.

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

于 2013-03-20T01:27:14.563 回答