我有这个代码将所有联系人图像存储在字典中。但是,在某些情况下,当它被中断时,联系人的图像就会消失。
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]];
}
});
答案 0 :(得分:6)
单个ABPerson
不是线程安全的。您无法使用ABPerson
将dispatch_async()
传递给后台队列。如果要进行后台处理,则必须在每个线程上生成一个新的ABAddressBook
,并使用该线程上从该通讯录中提取的ABPerson
个记录。
如果您需要在线程之间逻辑传递ABPerson
,则需要使用ABRecordGetRecordID()
获取其ID。您可以使用ABPerson
传递该内容并在另一个线程(使用自己的地址簿)上重新构建新的ABAddressBookGetPersonWithRecordID()
记录。
@try
/ @catch
在ObjC中非常罕见,你应该有充分的理由这样做。在ARC下,您通常会泄漏内存。例外意味着该程序出现问题并且很快就会崩溃。
您正在泄露data
。您应该在CFBridgingRelease()
使用__bridge
,而不是Copy
。您需要平衡contactImagesDi
。
您对NSMutableDictionary
的修改非常危险,假设这是一本字典。 dispatch_async
不是线程安全的。如果它是您正在使用KVC的对象,那么它可能是线程安全的,但前提是您已经采取了一些措施来确保这一点。通常,更好的解决方案是使用{{1}}将这种更新重新放回主线程。