我有一个对象数组,我想对其执行块操作。我不确定执行此操作的最佳方法。我正在做类似下面代码的事情,但我认为这不是最佳实践。
进行此类操作的最佳方法是什么?
- (void)performBlockOnAllObjects:(NSArray*)objects completion:(void(^)(BOOL success))completionHandler {
NSInteger counter = objects.count;
for (MyObject *obj in objects) {
[obj performTaskWithCompletion:^(NSError *error) {
counter--;
if (counter == 0) {
completionHandler(YES);
}
}];
}
}
通常您会为此使用调度组。您在调用方法之前“进入”组,在完成处理程序中“离开”,然后指定当组通知您所有“进入”调用已被“离开”调用抵消时应调用的块。
- (void)performBlockOnAllObjects:(NSArray*)objects completion:(void(^)(BOOL success))completionHandler {
dispatch_group_t group = dispatch_group_create();
for (MyObject *obj in objects) {
dispatch_group_enter(group);
[obj performTaskWithCompletion:^(NSError *error) {
dispatch_group_leave(group);
}];
}
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
completionHandler(YES);
});
}
这是指定在一系列其他异步任务完成时异步调用的代码块的典型模式。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)