草庐IT

iphone - ABPersonCopyImageDataWithFormat 删除联系人图片

coder 2024-01-15 原文

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

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

        }

});

最佳答案

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

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

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

您正在泄漏数据。您应该在此处使用 CFBridgingRelease(),而不是 __bridge。您需要平衡 Copy

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

关于iphone - ABPersonCopyImageDataWithFormat 删除联系人图片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15458522/

有关iphone - ABPersonCopyImageDataWithFormat 删除联系人图片的更多相关文章

随机推荐