0
UIImage* image;

if(ABPersonHasImageData(self.abRecordRef)){
    image = [UIImage imageWithData:(__bridge_transfer NSData *)ABPersonCopyImageData(self.abRecordRef)];
}


-(ABRecordRef) abRecordRef
{
    ABRecordRef abR = ABAddressBookGetPersonWithRecordID ([RCABAddressBookHandler addressBook],self.recordID);
    return abR;
}

我想把它移到另一个线程。

但是 addressBook 的定义是

+(ABAddressBookRef) addressBook
{
    return [RCABAddressBookHandler singleton].addressBook;
}

它被宣布为

@property (nonatomic) ABAddressBookRef addressBook;

这不是类型安全的。

所以我该怎么做?

我应该为不同的线程创建新的 ABAddressBookRef 吗?这就是核心数据的方法吗?为不同的线程创建新的 nsmanagedobjectcontext?

我能想到的一种解决方案是为每个线程创建一个新的地址簿

-(ABRecordRef) abRecordRef
{
    ABAddressBookRef _addressBook;
    _addressBook =ABAddressBookCreate();
    ABRecordRef abR = ABAddressBookGetPersonWithRecordID (_addressBook,self.recordID);
    CFRelease(_addressBook);
    return abR;
}

但这意味着 abR 将在没有任何 ABAddressBookRef 的情况下“生存”。还好吗?

顺便说一句,这让事情变得更加缓慢,因为 ABAddressBookCreate 实际上是相当 CPU 激励。

4

1 回答 1

1

文档状态:

重要提示:您必须确保一个实例ABAddressBookRef仅由一个线程使用。

所以是的,您必须为每个线程创建一个。但是,您可能应该更清楚您的实际问题是什么,然后我们可以提出一些更合适的解决方案。

于 2013-05-20T12:28:24.147 回答