2016-07-24 2 views
0

Ich brauche MultipeerConnectivity zu senden Bilder und einige Reihe von Arrays von Zeichenfolgen zu einem anderen Gerät. Auf der Empfängerseite ist die API func session(session: MCSession, didReceiveData data: NSData, fromPeer peerID: MCPeerID), sie empfängt nur NSData Daten. Aber ich brauche etwas zu senden:Wie kombinieren Sie diese verschiedenen Werttypen zu NSData?

struct data{ 
var imageData:NSData? 
var location:[String:String]? 
var information:[String]? 
var sliderInfo:[String]? 
var questionsAndAnswer:[String:String]? 
var secrets: String? 
var tempts: Int? 

} 

Es gibt viele verschiedene Werttypen in der Datenstruktur, aber wie konvertiere ich diese benutzerdefinierte Datenstruktur NSData und dann entschlüsseln, dass auf der Empfängerseite? Ich benutze Swift für dieses Projekt.

Antwort

0

ich eine andere Möglichkeit, dieses Problem zu lösen: Auf der Senderseite, senden Sie die Dictionary:[String:[String]], kodieren, die, und die Seite, auf der Empfänger entschlüsseln. Für NSData, sende ich das wieder. Trennen Sie es von den anderen Daten.

 let imageData = UIImageJPEGRepresentation(self.detailImage!, 1.0) 

     let msg = ["clickHidenInfo":[clickHidenInfo],"swipeInfo":upDownLeftRight,"sliderInfo":slideHiddenInforation,"locationInfo":["x1,y1,info","x2,y2,info"],"qa":["what's your name","Jerry"],"hints":["hints I provide"],"tempts":["tempts you can use"]] 



//sender: 
     let msgData = NSKeyedArchiver.archivedDataWithRootObject(msg) 

     do 
     { 
      try self.session?.sendData(imageData!, toPeers: (self.session?.connectedPeers)!, withMode: .Unreliable) 
      print("succee") 
     } 
     catch{ 
      print("failure") 
     } 

     do 
     { 
      try self.session?.sendData(msgData, toPeers: (self.session?.connectedPeers)!, withMode: .Unreliable) 
      print("succee") 
     } 
     catch{ 
      print("failure") 
     } 
//receiver side 
dispatch_async(dispatch_get_main_queue()){ 


     let dict = NSKeyedUnarchiver.unarchiveObjectWithData(data) 
     if dict == nil 
     { 
      self.guessImage.image = UIImage(data: data) 
      self.guessImage.reloadInputViews() 
     } 
     else 
     { 
      let result = NSKeyedUnarchiver.unarchiveObjectWithData(data) as? Dictionary<String,[String]> 
      let a = result!["swipeInfo"] 
      print("\(a![0])") 
     } 


    } 
3

Sie werden es leichter haben, wenn Sie dies zu einer NSObject-Unterklasse machen, die NSCoding übernimmt. Mit NSCoding und NSKeyedArchiver können Sie beliebige Daten in NSData serialisieren und später die beliebigen Daten abrufen.

+0

Meinen Sie, machen Sie die Struktur wie folgt: struct Daten: NSCoding {/ * etwas * /}? –

+0

Sie können kein Struct mit NSCoding konform machen. Es muss eine NSObject-Unterklasse sein. –

+0

"Meinen Sie, machen Sie die Struktur so" Nein, das habe ich nicht gesagt. Ich habe die NSObject-Unterklasse angegeben. Das ist eine Klasse, keine Struktur. Sie müssen die Hilfe von Cocoa hier anwerben; Das kann man nicht mit einer Swift-Struktur machen. – matt

-2
NSMutableDictionary *mutDic = [NSMutableDictionary dictionary]; 
[mutDic setValue:data.imageData forKey:@"imageData"]; 
[mutDic setValue:data.location forKey:@"location"]; 
[mutDic setValue:data.information forKey:@"information"]; 
[mutDic setValue:data.sliderInfo forKey:@"sliderInfo"]; 
+0

Es ist nicht mir, deinen Kommentar zu widmen. –