2016-03-14 3 views
0

Попытка написать небольшую карточную игру в режиме реального времени с использованием GameKit и GKMatch. Я следовал this Game Center tutorial (в Objective-C), но теперь застрял пытается преобразовать это в Swift 2.Данные, отправленные через NSData, принимаются только частично

Мои перечислений и структур:

enum Messagetype:Int { 
     case kMessageTypeRandomNumber = 0 
     case kMessageTypeGameBegin = 1 
     case kMessageTypeMove = 2 
     case kMessageTypeGameOver = 3 
    } 

struct Message { 
    var messageType:Messagetype = .kMessageTypeMove 
} 

struct MessageRandomNumber { 
    var message = Message() 
    var randomNumber: Int = -1 
} 

var ourRandomNumber:Int = Int(arc4random_uniform(100000))+1 

весело sendRandomNumber()

func sendRandomNumber() { 
     var message = MessageRandomNumber() 

     message.randomNumber = self.ourRandomNumber 
     message.message.messageType = .kMessageTypeRandomNumber 

     let data = NSData(bytes: &message, length: sizeof(MessageRandomNumber)) 
     self.sendData(data) 
     print ("Random number \(message.randomNumber) sent from \(localPlayer.alias!)") 
} 

функ SendData

func sendData(data: NSData) { 

     let gameKitHelper = GameKitHelper.sharedGameKitHelper 
     var succes:Bool? = true 

     do { 
      try gameKitHelper.match.sendDataToAllPlayers(data, withDataMode: .Reliable) 
      } catch { 
       succes = nil 
      } 
      if succes == nil { 
       print ("Error sending data.") 
     } 
} 

функ match.didReceiveD ата

func match(match: GKMatch, didReceiveData data: NSData, fromRemotePlayer player: GKPlayer) { 
     print ("Data received.") 
     let message:Message = UnsafePointer<Message>(data.bytes).memory as Message 

     if (message.messageType == .kMessageTypeRandomNumber) { 
      let messageRandomNumber:MessageRandomNumber = UnsafePointer<MessageRandomNumber>(data.bytes).memory as MessageRandomNumber 

      print ("Received random number \(messageRandomNumber.randomNumber)") 
} 

можно увидеть в журналах, что случайное число <> 0 выбрано и отправленных с помощью sendRandomNumber из устройства.

пошагового didReceiveData Я вижу, что:.

  1. message.messageType = .kMessageTypeRandomNumber (который отличается от значения структура была инициализирована с Кроме того, это значение было установлено в sendRandomNumber, так что я считаю, что часть отправляется правильно).
  2. messageRandomNumber.message.messageType = .kMessageTypeRandomNumber (опять же правильно)
  3. Однако messageRandomNumber.randomNumber всегда 0 (что не является правильным)

Есть ли что-то очевидно, что я здесь отсутствует?

ответ

0

сделалReceiveData вызывается, когда данные получены. Он вызывается снова, когда больше данные получены. Вы должны собирать данные (или обрабатывать их по мере их поступления, осознавая, что они неполны), и при завершении данных есть еще один обратный вызов.

+0

Спасибо. Это имеет смысл, однако я не могу найти это в документации Apple (https://developer.apple.com/library/prerelease/ios/documentation/GameKit/Reference/GKMatchDelegate_Ref/index.html#//apple_ref/ occ/intfm/GKMatchDelegate/match: didReceiveData: fromRemotePlayer :) –

+0

Упс, нажимайте слишком быстро на мобильном телефоне. Можете ли вы указать мне в правильном направлении, где я могу найти, как я должен это делать в Свифт? –

+0

Могу ли я использовать EnumerateByteRangesUsingBlock для этого, возможно, вместо прямого доступа к свойству bytes? –

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