Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/100.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios NSData在发送到其他设备后丢失_Ios_Swift_Swift2_Nsdata_Send - Fatal编程技术网

Ios NSData在发送到其他设备后丢失

Ios NSData在发送到其他设备后丢失,ios,swift,swift2,nsdata,send,Ios,Swift,Swift2,Nsdata,Send,在设备之间传输时数据丢失。怀疑它真的丢失了-我肯定我做错了什么-但是什么 4分步骤进行。前3个步骤非常有效,我能够验证数据是否可以被解析(在发送之前)我收到数据,但不是全部?解析时,我可以确认数据类型,但不能确认类别信息(性别、类别、子类别)-为什么?步骤如下: 生成和存储数据(本地) 验证数据是否正确存储 将数据发送到其他设备(iPhone) 接收数据和分析信息-->失败 1。生成数据 func selectCategories(){ //Fixed data for testing

在设备之间传输时数据丢失。怀疑它真的丢失了-我肯定我做错了什么-但是什么

4分步骤进行。前3个步骤非常有效,我能够验证数据是否可以被解析(在发送之前)我收到数据,但不是全部?解析时,我可以确认数据类型,但不能确认类别信息(性别、类别、子类别)-为什么?步骤如下:

  • 生成和存储数据(本地)
  • 验证数据是否正确存储
  • 将数据发送到其他设备(iPhone)
  • 接收数据和分析信息-->失败
  • 1。生成数据

    func selectCategories(){
        //Fixed data for testing
        let gender = "Women"
        let category = "Shoes"
        let subCategory = "Pumps"
    
        print("SENDING - Gender: \(gender), Category: \(category), SubCategory: \(subCategory)")
    
        sendCategories(gender, category: category, subCategory: subCategory)
    
    }
    
    func sendData(data: NSData) {
        print("SENDING DATA")
        var sendDataError: NSError?
        let gameKitHelper = GameKitHelper.sharedInstance
    
        if let multiplayerMatch = gameKitHelper.multiplayerMatch {
            do {
                try multiplayerMatch.sendDataToAllPlayers(data, withDataMode: GKMatchSendDataMode.Reliable)
            } catch let error as NSError {
                print("Error while sending data: \(error)")
            } catch {
                print("Catch all errors: \(error)")
            }
        }
    }
    
    2。验证存储的数据

    func sendCategories(gender: String, category: String, subCategory: String){
        var messageCategory = MessageCategory(message: Message(messageType: MessageType.Category), gender: gender, category: category, subCategory: subCategory)
        let data = NSData(bytes: &messageCategory, length: sizeof(MessageCategory))
        print("SEND - LENGTH: \(data.length)")
    
        // VERIFY DATA STORED SUCCESFULLY (FOR TESTING PURPOSES ONLY)
        let messageCategoryFromData = UnsafePointer<MessageCategory>(data.bytes).memory
        if messageCategoryFromData.message.messageType == MessageType.Category{
    
        print("SENDING - Gender: \(messageCategoryFromData.gender), Category: \(messageCategoryFromData.category), SubCategory: \(messageCategoryFromData.subCategory)")
    
        let temp_gender = messageCategoryFromData.gender
        let temp_category = messageCategoryFromData.category
        let temp_subCategory = messageCategoryFromData.subCategory
        let message = messageCategoryFromData.message
    
        // SUCCESSFULLY PRINTS THE GENDER ETC WITH CORRECT INFORMATION -> DATA PARSING WORKS PRIOR TO SENDING DATA
        print("RECEIVED (PRIOR TO SENDING). Gender: \(temp_gender) Category: \(temp_category) SubCategory: \(temp_subCategory)")
        }
        else{
            print("WRONG MESSAGE TYPE")
        }
    
        // SEND THE DATA
        sendData(data)
    }
    
    4。接收数据和分析信息(错误)


    我稍微修改了你的代码

    import XCPlayground
    import Foundation
    
    enum MessageType: Int {
        case RandomNumber, Category, GameBegin, Move, LapComplete, GameOver
    }
    
    struct Message {
        let messageType: MessageType
    }
    
    struct MessageCategory {
        let message: Message
        let gender: String
        let category: String
        let subCategory: String
    }
    
    func sendCategories(gender: String, category: String, subCategory: String)->NSData {
        var messageCategory = MessageCategory(message: Message(messageType: MessageType.Category), gender: gender, category: category, subCategory: subCategory)
        let data = NSData(bytes: &messageCategory, length: sizeof(MessageCategory))
        print("SEND - LENGTH: \(data.length)")
    
        // VERIFY DATA STORED SUCCESFULLY (FOR TESTING PURPOSES ONLY)
        let messageCategoryFromData = UnsafePointer<MessageCategory>(data.bytes).memory
        if messageCategoryFromData.message.messageType == MessageType.Category{
    
            print("SENDING - Gender: \(messageCategoryFromData.gender), Category: \(messageCategoryFromData.category), SubCategory: \(messageCategoryFromData.subCategory)")
    
            let temp_gender = messageCategoryFromData.gender
            let temp_category = messageCategoryFromData.category
            let temp_subCategory = messageCategoryFromData.subCategory
            let message = messageCategoryFromData.message
    
            // SUCCESSFULLY PRINTS THE GENDER ETC WITH CORRECT INFORMATION -> DATA PARSING WORKS PRIOR TO SENDING DATA
            print("RECEIVED (PRIOR TO SENDING). Gender: \(temp_gender) Category: \(temp_category) SubCategory: \(temp_subCategory)")
        }
        else{
            print("WRONG MESSAGE TYPE")
        }
    
        // SEND THE DATA
        //sendData(data)
        return data
    }
    
    let data = sendCategories("gender", category: "category", subCategory: "subcategory")
    
    func matchReceivedData(data: NSData, fromPlayer player: String) {
    
        var message = UnsafePointer<Message>(data.bytes).memory
    
        if message.messageType == MessageType.Category {
    
            let messageCategory = UnsafePointer<MessageCategory>(data.bytes).memory
    
            print("MESSAGE: \(messageCategory.message)")
            print("DATA TYPE: \(messageCategory.message.messageType)")
            print("RECEIVED - LENGTH: \(data.length)")
    
            let gender = messageCategory.gender
            let category = messageCategory.category
            let subCategory = messageCategory.subCategory
    
    
            print("RECEIVING - Gender: \(gender), Category: \(category), subCategory: \(subCategory)")
        }
    }
    
    matchReceivedData(data, fromPlayer: "player")
    
    /*
    SEND - LENGTH: 80
    SENDING - Gender: gender, Category: category, SubCategory: subcategory
    RECEIVED (PRIOR TO SENDING). Gender: gender Category: category SubCategory: subcategory
    MESSAGE: Message(messageType: MessageType.Category)
    DATA TYPE: Category
    RECEIVED - LENGTH: 80
    RECEIVING - Gender: gender, Category: category, subCategory: subcategory
    */
    

    错误是我使用了
    Struct
    来处理数据。但是在阅读之后,我意识到结构只是指向数据。这导致我的
    String
    数据没有与NSData一起发送(
    Float
    Int
    工作正常)


    解决方案是不使用struct来处理对象数据,而是将其作为原始NSData传递,然后始终包含一部分数据,该部分数据告诉它是哪种类型的数据,然后使用正确的解析。

    尝试在步骤4中进行更改:删除
    var message=UnsafePointer(data.bytes).memory
    并在那里添加一行
    let messageCategory=UnsafePointer(data.bytes).memory
    。同时将if改为
    if messageCategoryFromData.message.messageType==messageType.Category
    谢谢@sunshine的建议。但是我需要第一个
    var message=UnsafePointer(data.bytes.memory)
    来测试接收到哪种类型的数据,然后正确地解析它。关于什么可能会干扰发送或接收的任何其他想法?谢谢重新编码。我也意识到错误在发送或接收部分的某个地方,因为我的步骤2正确地解析了信息。“匹配”用于代码的另一部分,我在这里没有展示它以减少混乱。知道发送或接收的问题是什么吗?上面的步骤4
    matchReceivedData
    介绍了接收部分。是
    GameKit
    的功能部分,当另一台设备在游戏期间接收数据时,会自动调用该功能。正如您可以看到的那样,如果message.messageType==messageType.Category起作用,则
    。但是
    让gender=messageCategory.gender
    等变为零。我现在不明白为什么会这样:(@PederWessel)唯一的答案是,在你接收数据时,它实际上是零。这就是为什么我给你发了一个正确数据的例子。
    enum MessageType: Int {
        case RandomNumber, Category, GameBegin, Move, LapComplete, GameOver
    }
    
    struct Message {
        let messageType: MessageType
    }
    
    struct MessageCategory {
        let message: Message
        let gender: String
        let category: String
        let subCategory: String
    }
    
    import XCPlayground
    import Foundation
    
    enum MessageType: Int {
        case RandomNumber, Category, GameBegin, Move, LapComplete, GameOver
    }
    
    struct Message {
        let messageType: MessageType
    }
    
    struct MessageCategory {
        let message: Message
        let gender: String
        let category: String
        let subCategory: String
    }
    
    func sendCategories(gender: String, category: String, subCategory: String)->NSData {
        var messageCategory = MessageCategory(message: Message(messageType: MessageType.Category), gender: gender, category: category, subCategory: subCategory)
        let data = NSData(bytes: &messageCategory, length: sizeof(MessageCategory))
        print("SEND - LENGTH: \(data.length)")
    
        // VERIFY DATA STORED SUCCESFULLY (FOR TESTING PURPOSES ONLY)
        let messageCategoryFromData = UnsafePointer<MessageCategory>(data.bytes).memory
        if messageCategoryFromData.message.messageType == MessageType.Category{
    
            print("SENDING - Gender: \(messageCategoryFromData.gender), Category: \(messageCategoryFromData.category), SubCategory: \(messageCategoryFromData.subCategory)")
    
            let temp_gender = messageCategoryFromData.gender
            let temp_category = messageCategoryFromData.category
            let temp_subCategory = messageCategoryFromData.subCategory
            let message = messageCategoryFromData.message
    
            // SUCCESSFULLY PRINTS THE GENDER ETC WITH CORRECT INFORMATION -> DATA PARSING WORKS PRIOR TO SENDING DATA
            print("RECEIVED (PRIOR TO SENDING). Gender: \(temp_gender) Category: \(temp_category) SubCategory: \(temp_subCategory)")
        }
        else{
            print("WRONG MESSAGE TYPE")
        }
    
        // SEND THE DATA
        //sendData(data)
        return data
    }
    
    let data = sendCategories("gender", category: "category", subCategory: "subcategory")
    
    func matchReceivedData(data: NSData, fromPlayer player: String) {
    
        var message = UnsafePointer<Message>(data.bytes).memory
    
        if message.messageType == MessageType.Category {
    
            let messageCategory = UnsafePointer<MessageCategory>(data.bytes).memory
    
            print("MESSAGE: \(messageCategory.message)")
            print("DATA TYPE: \(messageCategory.message.messageType)")
            print("RECEIVED - LENGTH: \(data.length)")
    
            let gender = messageCategory.gender
            let category = messageCategory.category
            let subCategory = messageCategory.subCategory
    
    
            print("RECEIVING - Gender: \(gender), Category: \(category), subCategory: \(subCategory)")
        }
    }
    
    matchReceivedData(data, fromPlayer: "player")
    
    /*
    SEND - LENGTH: 80
    SENDING - Gender: gender, Category: category, SubCategory: subcategory
    RECEIVED (PRIOR TO SENDING). Gender: gender Category: category SubCategory: subcategory
    MESSAGE: Message(messageType: MessageType.Category)
    DATA TYPE: Category
    RECEIVED - LENGTH: 80
    RECEIVING - Gender: gender, Category: category, subCategory: subcategory
    */
    
    func matchReceivedData(match: GKMatch, data: NSData, fromPlayer player: String)