如何将这几种不同的值类型结合到 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 中?的主要内容,如果未能解决你的问题,请参考以下文章

阿里云几种云盘类型如何选择有啥区别

无法将'__ NSCFString'类型的值转换为'NSData'

帧缓冲

SDWebImage之工具类

为啥以下代码从 NSData 返回不正确的值?

这几种游戏类型,你认识吗?