Ищите пример кода для многопоточной сети MacOS - PullRequest
0 голосов
/ 01 октября 2008

Мой код должен запускать все сетевые процедуры в отдельном NSThread. У меня есть библиотека, в которую я передаю процедуру обратного вызова для связи:

my thread code
    library
        my callback (networking)
    library
my thread code

Моя процедура обратного вызова должна отправить некоторые данные на HTTP-сервер (NSURLConnection), дождаться ответа (запустить NSRunLoop?), А затем вернуться в библиотеку.
Затем библиотека обрабатывает данные. После того, как библиотека вернется в мою ветку, я могу опубликовать уведомление в основной ветке, которая обрабатывает рисование и ввод данных пользователем.

Есть ли пример кода, описывающий, как использовать NSURLConnection в NSThread?

Ответы [ 5 ]

1 голос
/ 27 марта 2009

Ссылка Кельвина не работает, вот немного кода, который делает то, что вы просите (предназначенный для запуска в методе, вызываемом [NSThread detachNewThreadSelector: toTarget: WithObject:]). Обратите внимание, что соединение в основном начинает работать как soo, когда вы входите в цикл выполнения, и что «terminateRunLoop» должен быть BOOL, для которого установлено значение NO при запуске и значение YES, когда соединение завершает загрузку или имеет ошибку.

Почему вы хотите сделать это вместо блокирования синхронного запроса? Одна из причин заключается в том, что вы можете захотеть правильно отменить длительное соединение, даже если у вас их не много. Также я видел, как пользовательский интерфейс немного зависает, если вы начинаете выполнять несколько асинхронных запросов в основном цикле выполнения.

NSURLConnection *connection = [[NSURLConnection connectionWithRequest:request delegate:self] retain];
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
while(!terminateRunLoop) 
{
    if ( ![[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode 
                                   beforeDate:[NSDate distantFuture]]) 
        {  break; }

        [pool drain];
    }
    [pool release];
}
1 голос
/ 05 октября 2008

Если вам нужно заблокировать, пока вы не выполнили работу, и вы уже находитесь в отдельном потоке, вы можете использовать +[NSURLConnection sendSynchronousRequest:returningResponse:error:]. Это немного тупо, поэтому, если вам нужно больше контроля, вам придется переключиться на асинхронный NSURLRequest с методами делегирования (т.е. обратными вызовами), запланированными в текущем NSRunLoop. В этом случае один из подходов может состоять в том, чтобы позволить вашему флагу делегата, когда это будет сделано, и разрешить циклу выполнения обрабатывать события, пока либо не будет установлен флаг, либо не истечет время ожидания.

0 голосов
/ 10 декабря 2008

По какой-то конкретной причине вы используете темы? Если вы не открываете много соединений, NSRunLoop в основном потоке должен быть достаточно хорошим. Если вам нужно выполнить блокировку в ответ, создайте свою ветку.

0 голосов
/ 10 декабря 2008

NSURLConnection может использоваться синхронно, через его асинхронные методы делегирования, в фоновом потоке (например, NSThread или NSOperation). Однако для этого нужно знать, как работает NSRunLoop.

Здесь есть сообщение в блоге с примером кода и пояснением, здесь: http://stackq.com/blog/?p=56

Пример кода загружает изображение, но я использовал эту концепцию для выполнения сложных POST-вызовов к REST API.

-Kelvin

0 голосов
/ 02 октября 2008

Чтобы ответить на ваш мини-вопрос «Запустить NSRunLoop?»:

Я не уверен, что понимаю, но звучит так, как будто вы говорите, что ваш псевдокод, описанный выше, выполняется во вторичном потоке (т. Е. Не в основном потоке обработки событий). Если это так, то, вероятно, нет смысла создавать NSRunLoop, потому что вы не можете выполнять какую-либо полезную работу, ожидая ответа от HTTP-сервера. Просто дайте потоку блокироваться.

...