iphone - GCD 与 NSURLConnection

标签 iphone ios objective-c-blocks grand-central-dispatch

我正在使用 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/

相关文章:

objective-c - 引用自身和实例变量的 block

iphone - 我可以隐藏我的 iPhone 应用程序或使其在 App Store 中无法搜索到吗?

iphone - UILocalizedIndexedCollat​​ion的sectionForObject :(id)object collationStringSelector:(SEL)selector method中选择器的作用是什么

iphone - 如何停止 UITextField.rightView 的动画?

ios - 我无法在 swift 3 中从给定的 url 获取 child 的名字?

ios - 如何在 Swift 中正确测试 Core Data

objective-c - 并行reduce算法实现

iphone - 如何获取 UITextField 点击事件?

iOS CoreVideo 内存泄漏

ios - 使用带有委托(delegate)回调的 NSURLConnection 和 sendAsynchronousRequest :queue:completionHandler:? 之间有区别吗