2016-03-14 39 views
0

试图使用GameKit和GKMatch编写一个小型实时纸牌游戏。 我已经按照this Game Center tutorial(在Objective-C),但现在卡住试图将其转换为雨燕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!)") 
} 

FUNC送出数据

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

FUNC match.didReceiveD ATA

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

didReceiveData被调用时一些数据被收到。当收到更多数据时,它会再次被调用。您必须收集数据(或在数据进入时处理数据,并知道数据不完整),并且在数据完成时还有另一个回调。

+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

哎呀,按下发送太快在移动。你能指出我在正确的方向,我可以找到我应该如何在Swift中做到这一点? –

+0

我可以使用EnumerateByteRangesUsingBlock代替直接访问bytes属性吗? –