我希望了解在调度中运行异步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?,但我仍然有点困惑。
答案 0 :(得分:4)
dispatch_after
内的代码在延迟之后实际运行之前不会阻止任何内容。然后它在指定的队列上运行。
由于您指定了主队列,因此代码将在主UI线程上运行。但是在延迟期间UI不会被“阻止”。
但这个例子很糟糕。虽然NSURL
和NSURLRequest
创建是在主线程上完成的,但请求的实际执行是异步完成的,因此在请求期间不会阻止主线程。直到调用完成处理程序之后才会再次返回主线程。但这是因为您指定了完成块的主队列,而不是因为dispatch_after
正在主线程上完成。
因此,在主线程上运行的唯一真实代码是NSURLConnection
完成块。实际请求在后台完成(因为它是异步的)。主线程上的其他代码很简单。
在调度块运行之前delaySeconds
期间没有阻塞任何线程。