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