2016-04-11 7 views
0

Я пытаюсь преобразовать CNContact объектов в NSData, которые будут отправлены на другое устройство через Multipeer Connectivity. Вот мой код для отправки данных контактов:Преобразование CNContact в NSData и наоборот

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, что указывает на то, что данные не равны нулю. Но когда я попытался развернуть объект в массив CNContacts, он возвращает nil. Любые идеи почему?

Обратите внимание, что я также попробовал просто отправить только один объект CNContact вместо массива из них, но результаты те же.

ответ

0

Я понял, что я случайно архивировал данные CNContact дважды в коде выше, а для unarchiving я сделал это только один раз. Изменение кода для при распаковке один ниже работы:

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 объект один раз и разархивировав, он не работает. Все еще не знаю, почему.

0

Ознакомьтесь с CNContactVCardСетеризационный класс

 Смежные вопросы

  • Нет связанных вопросов^_^