如何发送名为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
}
(我意识到这甚至没有解决发送与牌组相关的卡片的问题,但此时我已经陷入困境)
答案 0 :(得分:2)
这一行有几个问题:
NSData *outgoingPacket = [NSData dataWithBytes:&_deck length:sizeof(_deck)];
由于_deck
是指向对象的指针(Deck
的实例),sizeof(_deck)
只是给出了指针的大小。这对于单个内存地址来说已经够大了。
您无法正确修复通话,因为dataWithBytes:length:
适用于连续的内存块。您的托管对象极不可能通过该测试。
你可以独立发送每个字段,但这有点混乱。更简单的替代方法是使用NSDictionary
作为转移对象。根据需要在NSDictionary
和Deck
之间进行转换,并将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];