NSMutableURLRequest和NSURLConnection无法在GCD dispatch_async中工作?

时间:2012-03-02 03:33:50

标签: iphone nsurlconnection grand-central-dispatch nsurlrequest nsmutableurlrequest

我在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!
});

NSMutableURLRequestNSURLRequest之间有什么区别吗?或者,我以错误的方式使用NSURLConnection

谢谢!

1 个答案:

答案 0 :(得分:2)

这并不是说你在一个地方而不是另一个地方使用可变连接,而是你正在调用立即在当前线程上运行的同步请求方法,而不是需要运行循环来运行的异步方法。来自 - [NSURLConnection start]的文档:

  

如果你没有安排   在调用它之前,在运行循环或操作队列中建立连接   方法,连接被安排在当前的运行循环中   默认模式。

从后台线程上的块调用异步方法是多余的。您应该在主线程上调用异步方法(它立即返回并在后台调度其工作)或在异步调度块中调用同步方法。从第二种方式来看,您不必处理所有委托回调,但是您放弃了对加载操作的一些控制。