dispatch_after会阻止UI吗?

时间:2015-06-03 21:06:03

标签: ios objective-c grand-central-dispatch

我希望了解在调度中运行异步NSURLConnection是否有任何负面影响。我正在使用一个调度,因为它似乎比我的目的更清洁。

调用是异步的,但我想确保使用dispatch_after不会阻止UI。有人可以帮我理解dispatch_after是否会在10秒内以任何方式阻止UI / app?谢谢!

int delaySeconds = 10;

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delaySeconds 
* NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

    aURL = [NSURL URLWithString:@"http://google.com"];
    request = [NSMutableURLRequest requestWithURL:aURL
                                      cachePolicy:NSURLRequestUseProtocolCachePolicy
                                  timeoutInterval:60.0];

    [NSURLConnection sendAsynchronousRequest:request queue:
    [NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response) {

        //do something with response

    }];

});

P.S。我看了Does dispatch_after block the main thread?,但我仍然有点困惑。

1 个答案:

答案 0 :(得分:4)

dispatch_after内的代码在延迟之后实际运行之前不会阻止任何内容。然后它在指定的队列上运行。

由于您指定了主队列,因此代码将在主UI线程上运行。但是在延迟期间UI不会被“阻止”。

但这个例子很糟糕。虽然NSURLNSURLRequest创建是在主线程上完成的,但请求的实际执行是异步完成的,因此在请求期间不会阻止主线程。直到调用完成处理程序之后才会再次返回主线程。但这是因为您指定了完成块的主队列,而不是因为dispatch_after正在主线程上完成。

因此,在主线程上运行的唯一真实代码是NSURLConnection完成块。实际请求在后台完成(因为它是异步的)。主线程上的其他代码很简单。

在调度块运行之前delaySeconds期间没有阻塞任何线程。