2012-08-24 18 views
2

我是GKTurnBasedMatch的新手,我試圖找出在轉身期間玩家之間發送的「matchData」的最佳做法。我發現的所有教程主要包括髮送一串文本,我想發送更多的東西。如果有人能給我一個更高級的教程,那將是非常棒的。Game Center matchData的最佳實踐

我想做的一個例子是一場戰鬥。這兩名球員有他們的化身,他們有不同的細節(健康,攻擊,防守等),我應該如何發送這些數據?我認爲可能的唯一方法是將所有匹配細節(其中很多)詳細編碼到一個NSDictionary中,併發送它們以便它們可以再次放回到自定義匹配對象中。我應該實施NSCoding嗎?

謝謝!

+0

我認爲使用結構會比NSDictionary實例更高效。 –

回答

6

我會實現一個類,它存儲單個回合所需的所有相關信息,並讓類實現NSCoding。這意味着您可以在一個玩家的設備上將對象轉換爲NSData,然後將其轉換回另一側的對象。

本網站http://samsoff.es/posts/archiving-objective-c-objects-with-nscoding有一個簡單的例子,讓你去和這裏的主要方法的一個例子,你需要:

- (id)initWithCoder:(NSCoder *)decoder { 
    if (self = [super init]) { 
     self.health = [decoder decodeObjectForKey:@"health"]; 
     self.attack = [decoder decodeObjectForKey:@"attack"]; 
     isDead = [decoder decodeBoolForKey:@"isDead"]; 
    } 
    return self; 
} 

- (void)encodeWithCoder:(NSCoder *)encoder { 
    [encoder encodeObject:self.health forKey:@"health"]; 
    [encoder encodeObject:self.attack forKey:@"attack"]; 
    [encoder encodeBool:isDead forKey:@"isDead"]; 
} 

編碼的對象的NSData:

NSData *data = [NSKeyedArchiver archivedDataWithRootObject: object]; 

轉換回一個對象:

id *object = [NSKeyedUnarchiver unarchiveObjectWithData: inputData]; 

The Archives and Serializations Programming Guide is als o一個很好的起點。

另一種選擇是使用像RestKit這樣的庫,它是從JSON或XML映射到/從JSON或XML。

+1

非常感謝!我很感激你花了你的時間來做一個自定義的例子。 – gabriellanata

+0

沒問題。完成後向我發送一個鏈接到遊戲,我很樂意嘗試。 – danielbeard

+3

目前NSData回合制遊戲的大小限制是4096字節。確保保持數據量低。一個整數需要4個字節。在陣列中它堆積得很快。我最終將所有內容都保存在一個字符串中,這極大地減少了數據的大小。 – zeiteisen