iOS AFNetwork 3.0:是否有更快的方式发送多个API请求并等待所有API请求完成?

问题描述 投票:2回答:3

我目前正在使用以下方法发送GET API请求。这种方法有效,但我想知道是否有更快的方法。我需要的只是要知道所有已删除的邮件何时同步。任何提示或建议表示赞赏。

- (void)syncDeletedMail:(NSArray *)array atIdx:(NSInteger)idx {
    if (idx < array.count) {
        NSInteger idNumber = array[idx];

        [apiClient deleteMail:idNumber onSuccess:^(id result) {
            [self syncDeletedMail:array atIdx:(idx + 1)];
        } onFailure:^(NSError *error){
            [self syncDeletedMail:array atIdx:(idx + 1)];
        }];
    } else {
       NSLog(@"finished");
    }
}

编辑:我不关心它的完成顺序(不确定它在速度方面是否重要),只要所有的API请求都回来完成。

ios objective-c httprequest afnetworking-3
3个回答
1
投票

您可以立即发送deleteMail请求并使用dispatch_group知道所有请求何时完成。以下是实施,

- (void)syncDeletedMail:(NSArray *)array {

    dispatch_group_t serviceGroup = dispatch_group_create();

    for (NSInteger* idNumber in array)
    {
        dispatch_group_enter(serviceGroup);
        [apiClient deleteMail:idNumber onSuccess:^(id result) {
            dispatch_group_leave(serviceGroup);
        } onFailure:^(NSError *error){
            dispatch_group_leave(serviceGroup);
        }];
    }

    dispatch_group_notify(serviceGroup,dispatch_get_main_queue(),^{
       NSLog(@"All email are deleted!"); 
    });
}

在这里,您可以看到所有请求同时被触发,因此它将减少从n折叠到1的时间。


1
投票

Swift版本的@Kamran:

let group = DispatchGroup()
for model in self.cellModels {

    group.enter()

    HTTPAPI.call() { (result) in

        // DO YOUR CHANGE
        switch result {
           ...
        }
        group.leave()
    }
}
group.notify(queue: DispatchQueue.main) {
     // UPDATE UI or RELOAD TABLE VIEW etc.
     // self.tableView.reloadData()
}

0
投票

我想你的请求是由于你可能有大量的排队删除请求,而不仅仅是五个或十个。在这种情况下,我还会尝试考虑添加一个服务器端API调用,允许您一次删除多个项目,可能最多十个或二十个,这样您还可以减少网络流量的开销你正在生成(一个GET不只是发送你要删除的项目的id,而且还是一堆数据,基本上会为每次通话再次发送),通过分批分组邮件。

© www.soinside.com 2019 - 2024. All rights reserved.