Я копаюсь в кодировании iOS с помощью Swift, поэтому я новичок.
Мое приложение iOS (фактически игра) взаимодействует с игровым сервером, используя соединение с одним сокетом и собственный протокол JSON. Сообщения бывают односторонними (уведомления) и запрос/ответ (могут быть инициированы с обеих сторон). Запросы и ответы связаны друг с другом с помощью глобальных уникальных идентификаторов сообщений. Таким образом, это сильно отличается от простых запросов HTTP/REST.
Что может произойти сейчас (на самом деле проблема, которую мне нужно решить), например:
- Сервер отправляет запрос (запрашивая определенное действие... например, ход игроков) (идентификатор сообщения S01)
- Приложение одновременно отправляет запрос (для какого-то другого действия... например, список друзей) (идентификатор сообщения C01)
На данный момент моя игра для iOS использует класс SocketConnection, который подключается к серверу и может отправлять и получать (JSON) уведомления/запросы/ответы. Однако часть для отправки ответа потоку, инициировавшему запрос, отсутствует.
Я просмотрел документацию по iOS и множество блогов/учебников. Все они, кажется, охватывают GCD и то, как его использовать для параллелизма (перегрузка работы в рабочих и т. д.).
Однако мне нужно какое-то ожидание/уведомление, как в Java. Игровой сервер реализован на Java и при инициировании запроса клиента делает примерно следующее:
- принять запрос и создать для него уникальный идентификатор сообщения
- сохранить его в коллекции для дальнейшего использования
- ожидание (тайм-аут) объекта запроса
В фоновом режиме есть выделенный (частный) поток получателя, который получает все входящие сообщения:
в то время как (! завершено) {
- ждите следующего сообщения
- если сообщение является ответом, найдите соответствующий запрос по идентификатору сообщения
- поместите ответ в запрос
- notify() инициатор запроса на объект запроса
}
Я думал о разделении соединений на 3 или более, чтобы чередующиеся сообщения запроса/ответа вообще не появлялись, но я думаю, что эта идея не очень хороша из-за: а) обработки нескольких соединений будет намного сложнее поддерживать стабильность игры и б ) в долгосрочной перспективе должна быть возможность параллельно играть в несколько игровых сессий внутри одного и того же экземпляра приложения iOS.
На данный момент я думаю, что семафоры и sleep() могли бы работать, что было бы похоже на шаблон, реализованный на сервере. Но прежде чем пытаться реализовать это, я хотел бы знать, возможно ли это. Семафоры кажутся довольно быстрыми, но мне понадобятся миллионы семафоров — по одному для каждого уникального идентификатора сообщения). А если использовать семафоры: как мне реализовать ожидание()? Использование цикла занятости с засыпанием и опросом семафора? Я думаю, что функция ожидания () просто использовала бы ожидание () на семафоре.
Заранее спасибо за любые отзывы или идеи.