2008-10-01 8 views
-1

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

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

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

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

ответ

0

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

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

1

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

0

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

Существует сообщение в блоге ж/образец кода и объяснение, здесь: http://stackq.com/blog/?p=56

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

-Kelvin

0

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

1

Ссылка Кельвина мертва, вот немного кода, который выполняет то, о чем вы просите (предназначено для запуска в методе, называемом [NSThread detachNewThreadSelector: toTarget: WithObject:]). Обратите внимание, что соединение в основном начинает работать как су, когда вы входите в цикл выполнения, и что «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]; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^