如何从类型对象获取Swift类型的值Unmanaged<AnyObject>.我的例子是使用ABRecordRef
我创建了一个联系对象来管理ABRecordRef,但是我在从ObjC翻译时遇到了麻烦.这就是我所拥有的:
init(recordRef: ABRecordRef) {
if let firstName = ABRecordCopyValue(recordRef, kABPersonFirstNameProperty) {
self.firstName = firstName
}
}
Run Code Online (Sandbox Code Playgroud)
如果是ObjC,我会这样做:
CFTypeRef firstNameRef = ABRecordCopyValue(recordRef, kABPersonFirstNameProperty);
if (firstNameRef) {
self.firstName = (__bridge NSString *)firstNameRef;
}
Run Code Online (Sandbox Code Playgroud)
我似乎找不到正确的向下转换/转换组合,所以任何帮助都表示赞赏.
在我的iPhone应用程序中,我有一个名为的类Contact,它包含一个ABRecordRef用作特定联系人的引用.
我需要存储这些联系人的组NSUserDefaults,但由于Contact是自定义类,所以事情并没有很好.
在这种情况下该怎么做的任何想法?
我想获得一个ABPersonRef和ABGroupRef的所有属性的列表,而不必使用kABPersonFirstNameProperty的iOS预定义键,kABPersonLastNameProperty ...我正在使用地址簿,我想迭代所有的值一个特定的人.我知道有预定义的键,但Apple将来可以很好地添加新键,所以我想做类似的事情:
ABAddressBookRef addressBook = ABAddressBookCreate();
NSArray *allPeople = (NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBook);
for (int i = 0; i < [allPeople count]; ++i) {
ABRecordRef person = [allPeople objectAtIndex:i];
// This is the line that I can't figure out.
NSArray *allProperties = (NSArray *)ABRecordCopyArrayOfAllProperties(person);
}
Run Code Online (Sandbox Code Playgroud)
我知道我会遇到多个项目,我将不得不稍后循环,但目标是获取一个键列表,我可以迭代单值属性.我不在乎返回的类是什么,NSArray,NSDictionary ......无论如何.
我非常感谢任何建议!
我正在存储一个ABRecordID(实际上包裹在NSNumber中)的数组NSUserDefaults.到目前为止这么好,但现在我需要将其加载到ABRecordRef无法找到要使用的功能.
我只是在寻找从ABRecordID创建ABRecordRef的函数,就是这样.
我正在尝试使用内置方法将一个iPhone联系人转换为vCard.文档说使用:
ABPersonCreateVCardRepresentationWithPeople(CFArrayRef people)
Run Code Online (Sandbox Code Playgroud)
...但我的委托方法给了我这个:
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person;
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚如何创建一个CFArrayRef只有一个ABRecordRef.
文档指出我让CFArrayCreate()我更加困惑.我不知道足够的C来自己解决这个问题.我在SO中读到NSArray了一个叫做免费桥接的东西,应该可以互换CFArrayRef但不太明白如何使用它,因为当我尝试交换它们时编译器抱怨.
我ABAddressBook在我的应用程序中使用.
对AB的访问来自单独的线程以释放UI.
我知道对AB实例的访问必须始终来自同一个线程,因此我构建了一个包装器.
包装器是一个单例,它维护自己的后台线程.
到包装器的所有消息都会自动重定向到后台线程,而调用线程会一直等到实现结束,最后用相关数据(联系人列表,特定联系人等)填充out参数.
尽管如此,设备上的地址簿有时会被清空(擦除).
每10-20次使用该应用程序后.
所以,我几乎没有问题:
先感谢您.
-
迈克尔
我想将ABRecordRef存储在核心数据的"客户端"实体中.
我在苹果文档中读到ABRecordRef是一种原始的C数据类型.据我所知,您只能在核心数据中插入对象.考虑到这一点,将其存储在核心数据中的最佳方法是什么?
我考虑将其转换为NSNumber进行存储,但不知道如何将其转换回ABRecordRef以供使用.
我还以为我可以把它放在一个NSArray/NSSet/NSDictionary中,它本身只是作为一个包装器,但不知道这是否愚蠢/低效/甚至可行.
思想赞赏.
非常感谢
我开始用Objective-C学习编程,并且对C语言知之甚少.因此,iOS 6中的桥接构建对我来说仍然有点混乱.
这是场景:
我将一个人ABRecordID存储在CoreData中作为'NSNumber'属性.稍后,我想直接访问该人,因此我想使用该人的ABRecordID来使用ABAddressBook访问该联系人信息.注意到ABAddressBookGetPersonWithRecordID需要ABRecordID,下面是我在代码中执行转换的方法......
address_book = ABAddressBookCreate();
ABRecordID rec_id = (__bridge ABRecordID)person.record_id;
Run Code Online (Sandbox Code Playgroud)
然而,这没有成功,我得到了incompatible types casting 'int' into 'ABRecordID' (aka 'int') with a __bridge cast.
已经混淆了,在ARC类型和CF类型之间桥接转换的正确方法是什么?
另外,在哪种情况下我应该使用(__bridge retained)而不是(__bridge)?
我正在尝试加快将设备上所有联系人的联系人同步到我的应用.此时它在同步联系人时阻塞主线程.
我在NSInvocationOperation中添加了单独的联系人设置,并将其添加到NSOperationQueue.
我知道你只能访问主线程中的UI.关于地址簿数据,您无法访问哪些内容?
abrecordref ×9
ios ×8
iphone ×2
abrecord ×1
addressbook ×1
contacts ×1
core-data ×1
ipad ×1
swift ×1