Ios NSData在发送到其他设备后丢失
在设备之间传输时数据丢失。怀疑它真的丢失了-我肯定我做错了什么-但是什么强> 4分步骤进行。前3个步骤非常有效,我能够验证数据是否可以被解析(在发送之前)我收到数据,但不是全部?解析时,我可以确认数据类型,但不能确认类别信息(性别、类别、子类别)-为什么?步骤如下:Ios NSData在发送到其他设备后丢失,ios,swift,swift2,nsdata,send,Ios,Swift,Swift2,Nsdata,Send,在设备之间传输时数据丢失。怀疑它真的丢失了-我肯定我做错了什么-但是什么 4分步骤进行。前3个步骤非常有效,我能够验证数据是否可以被解析(在发送之前)我收到数据,但不是全部?解析时,我可以确认数据类型,但不能确认类别信息(性别、类别、子类别)-为什么?步骤如下: 生成和存储数据(本地) 验证数据是否正确存储 将数据发送到其他设备(iPhone) 接收数据和分析信息-->失败 1。生成数据 func selectCategories(){ //Fixed data for testing
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正确地解析了信息。“匹配”用于代码的另一部分,我在这里没有展示它以减少混乱。知道发送或接收的问题是什么吗?上面的步骤4matchReceivedData
介绍了接收部分。是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)