В этом примере PositionPacket - это просто структура. Следующая строка затем помещает эту структуру в NSData, который является просто объектом «байтового сегмента».
NSData *packet = [NSData dataWithBytes: &msg length: sizeof(PositionPacket)];
Так что, если вы просто хотите отправить оценку int, у вас может быть метод sendScore, который выглядит следующим образом:
- (void) sendScore
{
NSError *error;
int myScore = self.score;
NSData *packet = [NSData dataWithBytes:&myScore length:sizeof(myScore)];
[match sendDataToAllPlayers: packet withDataMode: GKMatchSendDataUnreliable error: &error];
if (error != nil)
{
// handle the error
}
}
Как правило, вам понадобится структура, в которой есть некоторая дополнительная информация, которая позволяет получателям знать, что это за данные. В примере это было бы целью этой строки:
msg.messageKind = PositionMessage;
В общем, вы можете отправлять все, что вы хотите, инкапсулированные в объекте NSData, так как это просто байт. Вы можете отправлять примитивные типы, такие как int, или структуры, как в примере, или даже NSObjects (при условии, что они реализуют NSCoding). Вы должны прочитать о NSKeyedArchiver, NSCoding и NSData для получения дополнительной информации об отправке и получении объектов NSO таким образом. Вот справочный документ Apple по Архивация .
Что касается получения, ВЫ не вызываете метод, он вызывается НА вас с помощью набора. Это то, что называется «метод делегата» (на языке какао) или «метод обратного вызова». Вы можете думать об этом как о «телефонном звонке», который ваше приложение может принимать асинхронно. Путем реализации метода с подписью:
- (void)match:(GKMatch *)match didReceiveData:(NSData *)data fromPlayer:(NSString *)playerID;
... вы говорите: «Я могу получить такой телефонный звонок». Поэтому, когда GameKit получает данные от вашего имени от другого игрока, он увидит, что вы хотите получать обратные вызовы такого рода, и затем вызовет этот метод - тогда вы должны обновить свое внутреннее состояние приложения на основе полученных данных.
Чтобы продолжить этот пример, если вы отправили простое сообщение «ничего, кроме целого числа», описанное выше, вы можете реализовать этот метод следующим образом:
- (void)match:(GKMatch *)match didReceiveData:(NSData *)data fromPlayer:(NSString *)playerID
{
int* receivedScorePtr = (int*)[data bytes];
int receivedScore = *receivedScorePtr;
[self updateScore: received forPlayer: playerID];
}
Это, конечно, при условии, что у вас есть метод updateScore: forPlayer: который обновит таблицу результатов.
Вы можете найти более общее обсуждение / объяснение того, как делегаты и методы делегатов работают в этой записи блога: http://mohrt.blogspot.com/2010/01/cocoa-and-delegates.html
ДОБАВЛЕНО: Используя код, который отправил Аскер, я сделал несколько модификаций и создал версию, которая «работает» для этого варианта использования. Рабочая версия тестового приложения для отправки одного целого числа через GameCenter Я не претендую ни на качество кода, ни на его пригодность для чего-либо вообще. Я не написал 99,9% из них - пожалуйста, не принимайте мои публикации здесь как одобрение всего, что появляется в нем.
Один извлеченный урок (которого я не знал, поэтому я надеюсь, что это поможет другим) заключается в том, что вы не можете использовать службу Matchmaking с симулятором. Это означает, что для тестирования этого сценария вам понадобятся два устройства iOS для разработки и, скорее всего, для нетривиальных программ - две машины для разработки для отладки обоих устройств одновременно. Эта проблема стоила мне больше всего времени при выяснении этого.