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

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

如果需要在线程之间逻辑地传递ABPerson,则需要使用ABRecordGetRecordID()获取其ID。您可以传递它,并使用ABPerson在另一个线程(具有自己的地址簿)上重建新的ABAddressBookGetPersonWithRecordID()记录。
@try / @catch在ObjC中非常罕见,您应该有充分的理由这样做。在ARC下,您通常会泄漏内存。异常表示程序有问题,应在短期内崩溃。

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

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

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

10-11 14:38