Проблемы GKSession - Objective-C GameKit

Хорошо, я пытался создать свой собственный объект GKSession, и метод делегата выдает мне ошибку в консоли, которую я еще не понял, как исправить. Мне было интересно, есть ли у кого-нибудь предложения или сталкивался ли с этой проблемой? * Просто примечание - переменная peerStatus определена в другом месте моего кода. Одноранговому узлу может быть присвоен статус «kServer» или «kClient». Я бы предпочел определить, что каждый из них находится в GKSessionModeServer или GKSessionModeClient, потому что я читал, что если одноранговый узел находится в GKSessionModePeer, время производительности на самом деле ниже, потому что он должен выполнять работу как клиента, так и сервера.

- (GKSession *)peerPickerController:(GKPeerPickerController *)picker sessionForConnectionType:(GKPeerPickerConnectionType)type {
    if (peerStatus == kServer) {
        GKSession *session = [[GKSession alloc] initWithSessionID:@"Josh_Land" displayName:nil sessionMode:GKSessionModeServer];
        return [session autorelease];
    }
    else {
        GKSession *session = [[GKSession alloc] initWithSessionID:@"Josh_Land" displayName:nil sessionMode:GKSessionModeClient];
        return [session autorelease]; 
    }
}

Полный код ошибки:

Прослушивание порта 56386 2009-06-30 10: 31: 41.892 GKTank [17756: 20b] *** Завершение работы приложения из-за неперехваченного исключения «GKInvalidArgumentException», причина: «Должен быть предоставлен действующий объект GKSession с режимом GKSessionModePeer, или создать объект GKSession по умолчанию, возвращающий 'nil' в реализации -peerPickerController: sessionForConnectionType :. Поставленный объект был: отправлено 0 пакетов данных: rush (0 пакетов 0 байтов): rely (0 пакетов 0 байтов): rtry (0 пакетов 0 байтов): sack (0 пакетов 0 байтов): текущее средневзвешенное значение rtt (0 мс) с режим сеанса: 0 '2009-06-30 10: 31: 41.893 GKTank [17756: 20b] Стек: (807902715, 2452446779, 807986683, 807986522, 927035842, 927037074, 927038407, 815223834, 927038949, 9245, 851062, 81470949, 9245, 851062, 81470948 815119058, 815114270, 814813151, 814722763, 814748641, 839148405, 807687520, 807683624, 839142449, 839142646, 814752238)


person Josh Bradley    schedule 30.06.2009    source источник
comment
Было бы полезно, если бы вы разместили полученную ошибку.   -  person Martin Gordon    schedule 30.06.2009
comment
Извините, я сейчас отредактировал сообщение с кодом ошибки. Это действительно работает, если я запускаю configure GKSession для GKSessionModePeer для обоих, но я стараюсь держаться подальше от этого. Я бы предпочел назначить сеанс либо в серверном, либо в клиентском режиме. Мне было интересно, возможно ли это прямо сейчас (где это только что появилось, может быть какая-то ошибка в коде ??) или это мой код?   -  person Josh Bradley    schedule 30.06.2009
comment
Я тоже не знаю ответа, но проверяли ли вы, действительно ли он работает медленнее? Если вы только читаете его медленнее, но на самом деле не заметили снижения производительности, это вполне может быть преждевременной оптимизацией. Тем не менее, было бы интересно посмотреть, что не так с вашим тестом.   -  person Kendall Helmstetter Gelner    schedule 30.06.2009


Ответы (1)


На самом деле я еще ничего не реализовал с помощью GameKit, но, просто просматривая документацию, похоже, что вы можете использовать GKPeerPickerController, только если вы используете GKSessionModePeer. Если вы хотите использовать GKSessionModeServer / Client, вам необходимо работать напрямую с сеансами и их делегатом. См. Раздел Руководства по программированию игрового комплекта на Реализация сервера и Подключение к службе.

Ваша основная функциональность будет вращаться вокруг метода GKSessionDelegate
-session:peer:didChangeState: как в клиентском, так и в серверном режимах и
-acceptConnectionFromPeer:error: и -denyConnectionFromPeer: в серверном режиме.

person Martin Gordon    schedule 30.06.2009