将 CNContact 转换为 NSData,反之亦然
Posted
技术标签:
【中文标题】将 CNContact 转换为 NSData,反之亦然【英文标题】:Converting CNContact to NSData and vice versa 【发布时间】:2016-04-11 10:33:26 【问题描述】:我正在尝试将 CNContact
对象转换为 NSData 以通过 Multipeer Connectivity 发送到另一台设备。这是我发送联系人数据的代码:
func sendContactsToPeer(peerId: MCPeerID, contacts: [CNContact])
let contactsData: NSData = NSKeyedArchiver.archivedDataWithRootObject(contacts)
do
try self.session.sendData(NSKeyedArchiver.archivedDataWithRootObject(contactsData), toPeers: self.session.connectedPeers, withMode: MCSessionSendDataMode.Reliable)
catch
print("Unable to send contacts data to \(peerId.displayName)")
这是用于接收联系人:
func session(session: MCSession, didReceiveData data: NSData, fromPeer peerID: MCPeerID)
print("Received data: \(data) From Peer: \(peerID)")
if let contacts: [CNContact] = NSKeyedUnarchiver.unarchiveObjectWithData(data) as? [CNContact]
self.delegate?.didReceiveContacts(contacts, fromPeer: peerID)
NSData
的 print 语句有输出,表示数据不为零。但是当我尝试将对象取消归档到 CNContacts 数组中时,它返回 nil。任何想法为什么?
请注意,我也尝试发送单个 CNContact
对象而不是它们的数组,但结果是相同的。
【问题讨论】:
【参考方案1】:我意识到我在上面的代码中不小心将CNContact
数据存档了两次,而为了取消存档,我只做了一次。更改用于取消归档以下代码的代码:
func session(session: MCSession, didReceiveData data: NSData, fromPeer peerID: MCPeerID)
print("Received data: \(data) From Peer: \(peerID)")
if let contactsData: NSData = NSKeyedUnarchiver.unarchiveObjectWithData(data) as? NSData
if let contacts: [CNContact] = NSKeyedUnarchiver.unarchiveObjectWithData(contactsData) as? [CNContact]
self.delegate?.didReceiveContacts(contacts, fromPeer: peerID)
但是,如果我只归档一次 CNContact
对象并取消归档它,它就不起作用。仍然不知道为什么。
【讨论】:
【参考方案2】:查看 CNContactVCardSerialization 类
【讨论】:
以上是关于将 CNContact 转换为 NSData,反之亦然的主要内容,如果未能解决你的问题,请参考以下文章
如何将 Kotlin ByteArray 转换为 NsData,反之亦然
如何将 std::string 转换为 NSData ,反之亦然?
将 NSData 转换为 NSString 并再次转换为 NSData?