如何正确使用地址簿作为后台线程?

时间:2013-05-20 10:16:37

标签: objective-c addressbook

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激励。

1 个答案:

答案 0 :(得分:1)

文档声明:

  

重要提示:您必须确保只有一个帖子使用ABAddressBookRef的实例。

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