【问题标题】:How to combine these several different value type to NSData?如何将这几种不同的值类型结合到 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。

【问题讨论】:

    标签: ios swift nsdata multipeer-connectivity


    【解决方案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"];
      

      【讨论】:

        猜你喜欢
        • 2020-10-19
        • 2015-08-03
        • 2019-12-19
        • 2022-08-19
        • 2013-07-05
        • 1970-01-01
        • 1970-01-01
        • 2020-02-05
        • 1970-01-01
        相关资源
        最近更新 更多