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

iOS AFNetwork 3.0: Is there a faster way to send multiple API requests and wait until all of it is finished?

我目前正在使用以下方法发送 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 请求都完成即可。

您可以一次发送 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

我想您的请求是因为您可能有大量排队的删除请求,而不仅仅是五个或十个。 在这种情况下,我也会尝试并考虑添加一个服务器端 API 调用,允许您一次删除多个项目,可能多达十个或二十个,这样您也可以减少开销您将生成的网络流量的一部分(单个 GET 不仅发送您要删除的项目的 ID,而且还发送一堆数据,这些数据基本上会在每次呼叫时反复发送)通过对邮件进行分组分批。

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()
}