Какая часть AsyncSocket / GCDAsyncSocketis является асинхронной? - PullRequest
0 голосов
/ 29 февраля 2012

Оба заголовка, GCDAsyncSocket и AsyncSocket, утверждают, что они асинхронные, оба выглядят одинаково. Однако все, что касается сокетов, касается обработки одного непрерывного потока неограниченной длины, поступающего из пакетов данных TCP. Сначала я был немного смущен, подумав, что AsyncSocket совершает какое-то волшебство, делая пользовательские пакеты запросов и ответов и обрабатывая их для меня асинхронно (например, если я делаю запрос A, B, C, тогда ответ от сервера может прийти в другой порядок, например B, C, A). Немного покопавшись в мире сокетов, я понял, что данные, поступающие как с сервера (через чтение сокетов), очень синхронны, а не асинхронны. Все дело в чтении одного потока, разрезании его на пакеты и выполнении обратных вызовов в мой класс делегата, и если я делаю запросы A, B, C, то ответы от сервера будут приходить в том же порядке A, B, C. AFAIK, AsyncSocket использует основной цикл выполнения, поэтому он снова использует основной поток, основную очередь. Итак, что же это за асинхронность?

Ответы [ 2 ]

2 голосов
/ 29 февраля 2012

Это асинхронный в том смысле, что вызовы чтения и записи возвращаются немедленно, не блокируя поток, и позволяют обрабатывать их результаты позднее с помощью делегирования и / или блоков.

0 голосов
/ 29 февраля 2012

UIAdam прав. Например, AsyncSocket реализует обратный вызов потока чтения, обрабатывая результаты в другом потоке. Вот фрагмент кода из его источника:

static void MyCFReadStreamCallback (CFReadStreamRef stream, CFStreamEventType type, void *pInfo) {
  NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

  AsyncSocket *theSocket = [[(AsyncSocket *)pInfo retain] autorelease];
  [theSocket doCFReadStreamCallback:type forStream:stream];

  [pool drain];
}  
...