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