2

Я поставил NSMutableURLRequest запрос в dispatch_async, но он не работает. Однако работает NSURLRequest. Код:NSMutableURLRequest и NSURLConnection не могут работать в GCD dispatch_async?

dispatch_queue_t queue1 = dispatch_get_global_queue(0, 0); 
dispatch_async(queue1, ^{ 

    NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://google.com"]]; 
    [request setHTTPMethod:@"GET"]; 
    NSURLConnection* connection = [NSURLConnection connectionWithRequest:request delegate:nil]; 
    [connection start];//It doesn't work! 

    //*** 
    NSURLRequest *theRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://google.com"]]; 
    NSURLResponse* theResponse = nil; 
    NSError* theError = nil; 
    NSData* data = [NSURLConnection sendSynchronousRequest:theRequest 
             returningResponse:&theResponse 
                error:&theError]; 
    //This works great! 
}); 

Есть ли разница между NSMutableURLRequest и NSURLRequest? Или, я использую NSURLConnection неправильно?

Спасибо!

ответ

2

Это не то, что вы используете изменяемое соединение в одном месте, а не другое, это то, что вы вызываете синхронный метод запроса, который немедленно запускается в текущем потоке по сравнению с асинхронным методом, которому нужен цикл запуска для работы , Из документации - [NSURLConnection пуск]:

Если вы не планируйте соединения в цикле выполнения или очередь операции перед вызовом этого метода , подключение планируются в текущем цикле выполнения в режим по умолчанию.

Вызов асинхронного метода из блока на фоновом потоке является избыточным. Вы должны либо вызывать метод async в основном потоке (он немедленно возвращается и расписывает свою работу в фоновом режиме), либо вызывают синхронный метод в рассылаемом async блоке. Выполняя это второй способ, вам не нужно иметь дело со всеми обратными вызовами делегатов, но вы отказываетесь от некоторого контроля над операцией загрузки.