ios - dispatch_async(dispatch_get_main_queue()在 NSMutableURLRequest 超时间隔后未触发

标签 ios grand-central-dispatch nsmutableurlrequest

我在我的应用中使用以下(简化的)GCD 调用:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    NSString *query = "/api/something";
    NSString *parameters = "a=1234&b=5678";   

    _myDict = (NSMutableDictionary*)[NetworkUtility postDataToServer:query withParameters:parameters];  


        // Done with API Call
        dispatch_async(dispatch_get_main_queue(), ^{

            // Do something

        });

});

当调用 NetworkUtility 时,将调用 NSURL 连接:

 NSData *postData = [parameters dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
 NSString *postLength = [NSString stringWithFormat:@"%lu",(unsigned long)[postData length]];

 NSString *urlString = [NSString stringWithFormat:@"https://myapp.com%@", query];

 NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:urlString] cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:7.0];

 [request setHTTPMethod:@"POST"];
 [request setValue:postLength forHTTPHeaderField:@"Content-Length"];
 [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
 [request setHTTPBody:postData];

 NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

 return response;

结果是,如果网络收到响应,dispatch_async(dispatch_get_main_queue() block 会按预期触发,但如果网络调用超时并且 _recommendationDictionary 是零,dispatch_async(dispatch_get_main_queue() 永远不会触发。

如果 NetworkUtility 正在返回一个值,为什么 dispatch_async(dispatch_get_main_queue() 没有立即触发?

最佳答案

block 在主队列中排队。主队列是一个串行队列,它会按顺序执行入队的 block 。

如果您在主线程上使用 CFRunLoop,那么主调度队列会在该运行循环中耗尽,因此如果运行循环被其他事件占用,也会导致执行这些 block 的延迟。

如果您实际上不需要执行在主线程上序列化的 UI 或其他事件,则最好不要使用主队列。

关于ios - dispatch_async(dispatch_get_main_queue()在 NSMutableURLRequest 超时间隔后未触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33903471/

相关文章:

objective-c - 使用 CGAffineTransform 在 View 上应用缩放和旋转

ios - 如果不推荐使用 NetService,我应该如何在 macOS 上执行 mDNS?

ios - 关于 ->> dispatch_queue_create ... 的困惑?

swift - 如何在 Swift 5.5 中等待来自同步函数的异步函数?

php - 如何将变量作为 POST 从 Cocoa-Touch 应用程序发送到我的 php 站点?

ios - 如何使用 Swift Alamofire 在 REST API 中发送 HTML 标签字符串?

iphone - 为什么 CFRunLoopRun 不起作用?

ios - 在 Swift 中使用 dispatch_async 并发分析一个数组

ios - Xamarin:NSMutableUrlRequest 和 NSUrlRequest 与 POST 方法和标题和数据?

java - java代码对应的swift中的web服务请求