【问题标题】:Sending a CoreData NSManagedObject to Another Player in Game Center将 CoreData NSManagedObject 发送给 Game Center 中的另一个玩家
【发布时间】:2013-12-05 17:06:22
【问题描述】:

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

根据调试控制台,当我尝试使用 [GKMatch sendData:toPlayers:] 方法发送 Deck *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

}

(我意识到这甚至没有解决发送与套牌相关的卡片,但我被困在这一点上)

【问题讨论】:

    标签: ios core-data game-center


    【解决方案1】:

    这行有几个问题:

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

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

    您可以单独发送每个字段,但这有点麻烦。一个更简单的选择是使用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];
    

    【讨论】:

    • 您的解决方案奏效了!非常感谢!我唯一的问题是将我的 NSManagedObject “解包”到 NSMutableDictionary 中。我必须手动输入 CoreData 实体的属性为 @{key:object};然后我必须对与前一个实体有关系的每个实体做同样的事情。我的数据模型现在很简单,但还是花了很长时间。如果我有一个包含大量实体和关系的庞大数据模型,我会怎么做?
    • 您可以使用核心数据属性的自省来为NSManagedObject 实现NSCoding 方法。 Core Data 只支持少数几种数据类型,所以应该没问题。
    猜你喜欢
    • 1970-01-01
    • 2015-06-26
    • 1970-01-01
    • 1970-01-01
    • 2012-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多