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