将核心数据NSManagedObject发送到Game Center中的另一个播放器

时间:2013-12-05 17:06:23

标签: ios core-data game-center

如何发送名为Deck * deck的核心数据对象,其中包含NSString,NSData照片对象和NSSet(与其他实体的一对多关系)。

当我尝试使用[GKMatch sendData:toPlayers:]方法发送Deck *套牌时,NSData * outgoingPacket仍然为零,但* deck有一个地址,根据调试控制台。

- (void) sendDeck {

    NSError *error;
    NSData *outgoingPacket = [NSData dataWithBytes:&_deck length:sizeof(_deck)];
    [self.myMatch sendData:outgoingPacket toPlayers:[NSArray arrayWithObject:self.pickerViewFriend] withDataMode:GKMatchSendDataReliable error:&error];

//myMatch is an instance of GKMatch.
//_deck is an instance variable set by @property Deck *deck, which is assigned by a UIPickerView, which works perfectly

}

(我意识到这甚至没有解决发送与牌组相关的卡片的问题,但此时我已经陷入困境)

1 个答案:

答案 0 :(得分:2)

这一行有几个问题:

NSData *outgoingPacket = [NSData dataWithBytes:&_deck length:sizeof(_deck)];
  1. 由于_deck是指向对象的指针(Deck的实例),sizeof(_deck)只是给出了指针的大小。这对于单个内存地址来说已经够大了。

  2. 您无法正确修复通话,因为dataWithBytes:length:适用于连续的内存块。您的托管对象极不可能通过该测试。

  3. 你可以独立发送每个字段,但这有点混乱。更简单的替代方法是使用NSDictionary作为转移对象。根据需要在NSDictionaryDeck之间进行转换,并将NSDictionary编码为NSData进行转移。类似的东西:

    NSDictionary *dict = // Fill this with the values you want to send
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:dict];
    

    然后在另一端,

    NSData *data = // data received from other device
    NSDictionary *dict = [NSKeyedUnarchiver unarchiveObjectWithData:data];