2016-04-11 12 views
0

Ich versuche, Objekte in NSData konvertieren über Multipleer Connectivity an ein anderes Gerät gesendet werden. Hier ist mein Code für das Senden der Kontakte Daten:Konvertieren von CNContact zu NSData und umgekehrt

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)") 
    } 
} 

Und das ist für den Empfang Kontakte:

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) 
    } 
} 

Es gibt Ausgang für die print-Anweisung für die NSData, was darauf hindeutet, dass die Daten nicht gleich Null ist. Aber wenn ich versuchte, das Objekt in ein Array von CNContacts zu entpacken, gibt es nil zurück. Irgendwelche Ideen warum?

Beachten Sie, dass ich auch versucht habe, nur ein einzelnes Objekt anstelle eines Arrays von ihnen zu senden, aber die Ergebnisse sind die gleichen.

Antwort

0

Ich erkannte, dass ich versehentlich die Daten im obigen Code archiviert habe, und für die Archivierung habe ich es nur einmal getan. Ändern Sie den Code für dearchiviert die die unter funktioniert:

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) 
     } 
    } 
} 

Aber wie auch immer, wenn ich das CNContact Objekt einmal und dearchivieren es nur archivieren, es funktioniert nicht. Ich habe immer noch keine Ahnung warum.

0

Auschecken CNContactVCardSerialization Klasse