NSMutableURLRequest и NSURLConnection не могут работать в GCD dispatch_async? - PullRequest
2 голосов
/ 02 марта 2012

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

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?

Спасибо!

1 Ответ

2 голосов
/ 02 марта 2012

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

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

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

...