如何将这几种不同的值类型结合到 NSData 中?
Posted
技术标签:
【中文标题】如何将这几种不同的值类型结合到 NSData 中?【英文标题】:How to combine these several different value type to NSData? 【发布时间】:2016-07-24 23:20:08 【问题描述】:我需要使用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。
【问题讨论】:
【参考方案1】:如果你把它变成一个采用 NSCoding 的 NSObject 子类,你会更轻松。 NSCoding 和 NSKeyedArchiver 是您将任意数据序列化为 NSData 并稍后检索任意数据的方式。
【讨论】:
你的意思是让结构像这样: struct data:NSCoding /*something*/ ? 你不能让 Struct 符合 NSCoding。它必须是一个 NSObject 子类。 "你的意思是让结构像这样" 不,我不是这么说的。我说的是 NSObject 子类。那是一个类,而不是一个结构。你需要在这里寻求 Cocoa 的帮助;你不能用 Swift 结构来做到这一点。【参考方案2】:我用另一种方法来解决这个问题:
在发送方,发送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])")
【讨论】:
【参考方案3】: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"];
【讨论】:
以上是关于如何将这几种不同的值类型结合到 NSData 中?的主要内容,如果未能解决你的问题,请参考以下文章