objective-c 等待多个异步函数完成后,再执行某段代码--GCD Group 的使用

本文介绍了一种利用GCD中的dispatch_group来等待一组异步任务完成的方法,并给出了具体的Objective-C实现示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有个 API 如下:

+ (void)updateByUser:(ALUser *)user completion:(void (^)(void))completion
{
    AVQuery *query = [AVQuery queryWithClassName:@"Feed"];
    query.limit = 15;
    [query orderByDescending:@"createdAt"];
    [query whereKey:@"user" equalTo:[AVObject objectWithoutDataWithClassName:@"User" objectId:user.objectId]];
    [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
        if (!error) {
            for (AVObject *feed in objects) {
                [self saveFeed:feed];
            }

            if (completion) {
                dispatch_async(dispatch_get_main_queue(), ^{
                    completion();
                });
            }
        } else {
            NSLog(@"Error: %@ %@", error, [error userInfo]);
        }
    }];
}

一次调用如下:

[ALFeed updateByUser:user completion:^{
    [self.tableView reloadData];
}];

但如果需要多次调用后再执行回调:

for (ALUser *user in users) {
    [ALFeed updateByUser:user completion:^{

    }];
}

如何在所有 updateByUser:completion: 执行完后,再执行 [self.tableView reloadData]; ?

JavaScript 可以用 promise 库(比如 bluebird )解决这样的问题:

var files = [];
for (var i = 0; i < 100; ++i) {
    files.push(fs.writeFileAsync("file-" + i + ".txt", "", "utf-8"));
}
Promise.all(files).then(function() {
    console.log("all the files were created");
});

但在 Objective-C 中,如何解决? 

这就要用到GCD 中dispatch_group 了:

示例:

dispatch_group_t group = dispatch_group_create(); 

for (ALUser *user in self.users) { 
dispatch_group_enter(group); 
[ALFeed updateByUser:user completion:^{ 
dispatch_group_leave(group); 
}]; 
} 

dispatch_group_notify(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 
[self.tableView reloadData]; 
}); 



=================================================================

另外的解决思路,没有实践,供大家参考:


1,ReactiveCocoa

2,combineLatest 

3,promisekit  库

4,NSOperation depends











参考: 

* [Waiting on Groups of Queued Tasks](  https://developer.apple.com/library/ios/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html#//apple_ref/doc/uid/TP40008091-CH102-SW25
* [Using dispatch groups to wait for multiple web services](  http://commandshift.co.uk/blog/2014/03/19/using-dispatch-groups-to-wait-for-multiple-web-services/)。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值