如何将这几种不同的值类型结合到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,然后再获取任意数据。
答
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
这不是我要发表你的评论。 –
你的意思是让结构像这样:struct data:NSCoding {/ * something * /}? –
您无法使Struct符合NSCoding。它必须是一个NSObject子类。 –
“你的意思是让结构像这样”不,这不是我说的。我说NSObject的子类。这是一个类,而不是一个结构。你需要在这里获得可可的帮助;你不能用Swift结构来做到这一点。 – matt