2

すべての連絡先画像を辞書に保存するこのコードがあります。ただし、場合によっては、中断すると連絡先の画像が消えるだけです。

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

        }

});
4

1 に答える 1

6

シングルABPersonはスレッドセーフではありません。ABPersonを使用して をバックグラウンド キューに渡すことはできませんdispatch_async()。バックグラウンド処理を行う場合は、ABAddressBook各スレッドで新しい を生成しABPerson、そのアドレス帳から取得したレコードをそのスレッドで使用する必要があります。

ABPersonスレッド間でを論理的に渡す必要がある場合は、 でその ID を取得する必要がありますABRecordGetRecordID()。それを渡してABPersonABAddressBookGetPersonWithRecordID().

@try/@catchは ObjC では非常にまれであり、それを行うには十分な理由があるはずです。ARC では、通常、メモリ リークが発生します。例外は、プログラムに問題があり、すぐにクラッシュするはずであることを示すためのものです。

あなたは漏れてdataいます。CFBridgingRelease()ではなく、ここで使用する必要があります__bridge。のバランスを取る必要がありCopyます。

これが辞書であると仮定すると、の変更contactImagesDiは非常に危険です。NSMutableDictionaryスレッドセーフではありません。それが KVC を使用しているオブジェクトである場合、それはスレッドセーフである可能性がありますが、それを確実にするために苦労した場合に限ります。通常、より良い解決策は、dispatch_asyncその種の更新をメイン スレッドに戻すために使用することです。

于 2013-03-20T01:27:14.563 に答える