2015-11-16 2 views
2

Данные теряются при передаче между устройствами. Сомневаюсь, что это действительно потеряно - Уверен, что я делаю что-то не так - но что ?!NSData отсутствуют после отправки на другое устройство

4 ступенчатый подход. Первые 3 шага работают как шарм, и я могу проверить, что данные могут быть проанализированы (перед отправкой). Получаю данные, но не все? При анализе я могу подтвердить тип данных, но не информацию о категории (Пол, Категория, Подкатегория) - почему? Шаги:

  1. Генерировать и хранения данных (локально)
  2. Сверить данные хранятся правильно
  3. Отправка данных на другое устройство (iPhone)
  4. получающего данные и анализировать информацию -> НЕУДАЧНЫЙ

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) 

} 

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) 
} 

3. Передача данных по

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)") 
     } 
    } 
} 

4. Прием данных и анализировать информацию (ERROR)

func matchReceivedData(match: GKMatch, 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)") <-- SUCCESSFUL 
     print("DATA TYPE: \(messageCategory.message.messageType)") <-- SUCCESSFUL 
     print("RECEIVED - LENGTH: \(data.length)")  <-- SUCCESSFUL 

     let gender = messageCategory.gender   <-- BECOMES NIL 
     let category = messageCategory.category  <-- BECOMES NIL 
     let subCategory = messageCategory.subCategory <-- BECOMES NIL 

     delegate?.setCategories(g, category: c, subCategory: s) 

     print("RECEIVING - Gender: \(gender), Category: \(category), subCategory\(subCategory)") 
    } 
} 

Несущие конструкции

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 
} 
+0

Попробуйте изменить на шаге 4: Удалить 'вар сообщение = UnsafePointer (data.bytes) .memory' и добавить туда строку' пусть messageCategory = UnsafePointer (data.bytes) .memory'. Также измените if на 'if messageCategoryFromData.message.messageType == MessageType.Category' – sunshinejr

+0

Спасибо за предложение @sunshine.Но мне нужно получить первое сообщение 'var message = UnsafePointer (data.bytes) .memory', чтобы проверить, какой тип данных получен, и после этого проанализировать его правильно. Любые другие идеи о том, что может нарушить отправку или получение? –

ответ

0

Ошибка в том, что я использовал Struct для обработки данных. Но после прочтения я понимаю, что структура указывает только на данные. Это привело к тому, что мои данные String не были отправлены с NSData (Float и Int отлично работает).

Решение состоит в том, чтобы не использовать struct для обработки данных объекта, но передавать его как необработанные NSData, а затем всегда иметь часть данных, которая включена, которая сообщает, какой тип данных она есть, а затем использовать правильный синтаксический анализ.

0

я слегка модифицирована вы код

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) 
+0

Спасибо за перекодировку. Я также понял, что ошибка находится где-то в отправляющей или принимающей части, так как мой шаг 2 правильно анализирует информацию. «Матч» используется в другой части кода, который я не показал здесь, чтобы уменьшить беспорядок. Любая идея, что может быть проблемой при отправке или получении? –

+0

мы не видим принимающую часть ... – user3441734

+0

Шаг 4 выше 'matchReceivedData' охватывает принимающую часть. Является функциональной частью 'GameKit', которая автоматически вызывается на другое устройство, когда это устройство получает данные во время игры. Как вы видите, работает 'if message.messageType == MessageType.Category'. Но «let gender = messageCategory.gender» и т. Д. Становится нулевым. Почему это - за меня сейчас :( –

Смежные вопросы