如何将这几种不同的值类型结合到NSData中?

问题描述:

我需要使用MultipeerConnectivity将图像和一些字符串数组发送到另一个设备。在接收端,API是func session(session: MCSession, didReceiveData data: NSData, fromPeer peerID: MCPeerID),它只收到NSData数据。但我需要发送这样的事情:如何将这几种不同的值类型结合到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? 

} 

有数据结构的内部许多不同的值类型,但我怎么转换这个自定义的数据结构来NSData然后解码是在接收端?我正在使用Swift进行这个项目。

我用另一种方式来解决这个问题: 发送侧,发送Dictionary:[String:[String]],编码和解码是在接收端。对于NSData,我再次发送。从其他数据中提取它。

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


    } 

如果您将此设置为采用NSCoding的NSObject子类,您将会有更轻松的时间。 NSCoding和NSKeyedArchiver是如何将任意数据序列化到NSData,然后再获取任意数据。

+0

你的意思是让结构像这样:struct data:NSCoding {/ * something * /}? –

+0

您无法使Struct符合NSCoding。它必须是一个NSObject子类。 –

+0

“你的意思是让结构像这样”不,这不是我说的。我说NSObject的子类。这是一个类,而不是一个结构。你需要在这里获得可可的帮助;你不能用Swift结构来做到这一点。 – matt

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

这不是我要发表你的评论。 –