我有此代码将所有联系人图像存储在字典中。但是,在某些情况下,当它被中断时,联系人的图像就会消失。
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
不是线程安全的。您不能使用ABPerson
将dispatch_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/