如何将这几种不同的值类型组合到 NSData 中呢?
How to combine these several different value type to NSData?
我需要使用 MultipeerConnectivity
将图像和一些字符串数组发送到另一台设备。在接收方,API是func session(session: MCSession, didReceiveData data: NSData, fromPeer peerID: MCPeerID)
,它只接收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?
}
dataStructure 中有许多不同的值类型,但如何将此自定义数据结构转换为 NSData
,然后在接收方对其进行解码?我正在为这个项目使用 Swift。
如果你把它做成一个采用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"];
我用另一种方法来解决这个问题:
在发送方,发送 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])")
}
}
我需要使用 MultipeerConnectivity
将图像和一些字符串数组发送到另一台设备。在接收方,API是func session(session: MCSession, didReceiveData data: NSData, fromPeer peerID: MCPeerID)
,它只接收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?
}
dataStructure 中有许多不同的值类型,但如何将此自定义数据结构转换为 NSData
,然后在接收方对其进行解码?我正在为这个项目使用 Swift。
如果你把它做成一个采用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"];
我用另一种方法来解决这个问题:
在发送方,发送 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])")
}
}