При использовании NSURLConnection в main (), почему соединение не может быть завершено? - PullRequest
0 голосов
/ 27 февраля 2012

Я сейчас тестирую HTTPFileUploadSample . Поскольку я хочу использовать его для создания типа программы командной строки, поэтому я вызываю метод в функции main (), например:

int main (int argc, const char * argv[])
{
    @autoreleasepool {
        Uploader *upl = [Uploader alloc]; 
        [upl initWithURL:[NSURL URLWithString:@"http://localhost/uploader.php"]
                filePath:@"/test.txt"
                delegate:upl
            doneSelector:@selector(onUploadDone)
           errorSelector:@selector(onUploadError)];
           //[[NSRunLoop currentRunLoop] run];   
   }
   return 0;
}

Я обнаружил, что он может создать соединение и отправить запрос в обычном режиме, но не может завершить соединение, потому что он не вызывает эти методы делегата ( connection: didReceiveResponse: или connection: didReceiveData: или connectionDidFinishLoading: ) вообще. Поэтому я вызываю метод [[NSRunLoop currentRunLoop] run] для запуска цикла (как комментарий в кодах), тогда все в порядке. Я не знаю почему. Кто-нибудь может дать мне какое-нибудь объяснение? Thx!

1 Ответ

1 голос
/ 27 февраля 2012

runloop - это большой бесконечный цикл обработчика событий (ну, бесконечный, пока он не остановится).Он просматривает различные источники и, когда они генерируют события, отправляет эти события слушателям.Это очень эффективный способ управления асинхронными операциями в одном потоке.

NSURLConnection (и многие другие в Какао) полагаются на runloop для их обработки.Если ничто не запускает цикл запуска, то события не обрабатываются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...