我正在使用 GCD
异步发送 HTTP
请求。这是不起作用的代码:
dispatch_async(connectionQueue, ^{
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setURL:[NSURL URLWithString:[NSString stringWithFormat:someURL]]];
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
[connection start];//Not working
});
上面的代码根本不起作用。我在 NSURLConnectionDelegate 的方法中没有收到任何回电。
但是当我尝试下面的代码时,一切正常并且我得到了正确的回调
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setURL:[NSURL URLWithString:[NSString stringWithFormat:someURL]]];
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
dispatch_async(connectionQueue, ^{
[connection start]; // working fine. But WHY ????
});
有人可以解释 block/GCD 的这种奇怪行为吗?
最佳答案
在您的代码示例的第一部分试试这个-
dispatch_async(dispatch_get_main_queue(), ^(void){
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
[connection start];
}
如果您将连接放在后台队列中,它会在队列完成后被推走,因此您无法获得委托(delegate)回调。连接可以在主队列中,因此它停留在主运行循环中以进行回调。或者,您可以创建自己的运行循环来按照其他人的建议为您处理后台操作。
关于iphone - GCD 与 NSURLConnection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13071978/