【问题标题】:iOS Handling Multiple Asynchronous Requests: Send a Signal When All Requests Are FinishediOS 处理多个异步请求:所有请求完成后发送信号
【发布时间】:2011-09-19 23:49:55
【问题描述】:

所以我正在浏览 Stack Overflow 以寻找有效处理异步请求的方法。现在我正在使用 ASIHTTPRequest 并且我的应用程序使用 REST API,其中对单个资源的请求会提示我请求 5 个或更多额外资源(链接资源)。

现在我在一个巨大的方法中处理所有异步请求,可能有大约 6 个异步请求,每个请求都有它们的 setCompletionBlock 和 setFailBlock。如果您使用过 ASIHTTPRequest,您一定知道需要多少重复代码。

无论如何,我似乎找到了一个解决方案来确定是否所有请求都以这个答案完成: Multiple asynchronous URL requests

但是,我不知道如何在代码中应用该答案,因为我之前没有使用过推送通知,而且我一直使用“self”作为委托而不是其他类。

任何想法我可以如何将答案应用于代码或更好,你知道任何其他方法吗?

提前致谢!

【问题讨论】:

    标签: iphone ios http asynchronous asihttprequest


    【解决方案1】:

    将所有请求放入 ASINetworkQueue:http://allseeing-i.com/ASIHTTPRequest/How-to-use#about_ASINetworkQueues

    ASINetworkQueue 有一个名为“queueDidFinishSelector”的回调。

    【讨论】:

    • 这个库会抛出很多 ARC 错误,您尝试在 iOS 应用程序 6 及更高版本中导入它。
    【解决方案2】:

    使用带有 dispatch_group_wait 的 GCD 组。

    例子:

    __block NSMutableArray *imageURLList = [NSMutableArray array];
    
    dispatch_group_t group = dispatch_group_create();
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    
    for (Helper *siteURL in list) {
        dispatch_group_async(group, queue, ^{
            NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:siteURL]];
            NSURLResponse *response;
            NSError *error;
            NSData *urlData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
            if (urlData.length)
                [imageURLList urlData];
        });
    }
    
    dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
    

    请注意,该块是异步执行的,因此可以使用sendSynchronousRequest:

    【讨论】:

    • 其实你还是不要这样做。除了没有动态解析之外,您无法处理代理或其他身份验证,并且无法取消操作。
    • 这段代码非常适合执行几十个 GET 请求。我在代码中所做的唯一修改是删除了同步 dispatch_group_wait() 函数,因为它是一种冻结主线程的方法。这给我带来了问题,因为我正在执行 150 多个异步操作,并且需要很长时间的请求使应用程序处于冻结状态。该应用程序运行良好(并且请求全部完成),无需等待。对于 RESTful 调用,请求最终会超时,所以最后一行代码真的没有必要,恕我直言。不过,我绝对愿意讨论它。
    猜你喜欢
    • 1970-01-01
    • 2015-06-09
    • 2016-08-21
    • 1970-01-01
    • 2018-05-27
    • 2019-03-26
    • 1970-01-01
    • 1970-01-01
    • 2018-06-12
    相关资源
    最近更新 更多