1

我有一组对象,我必须使用 afor-loop和进行迭代DispatchGroup。离开组内时for-loop,需要打电话continue吗?

let group = DispatchGroup()

for object in objects {

    group.enter()

    if object.property == nil {
         group.leave()
         continue // does calling this have any effect even though the group is handling it?
    }

    // do something with object and call group.leave() when finished
}
group.notify(...
4

2 回答 2

2

是的,调用 是绝对必要的continue,因为您想避免继续执行循环体。

调用DispatchGroup.leave不会退出当前范围,您需要调用continue才能实现。只会影响你对- 所以结果或调用leave所做的任何事情。DispatchGroupnotifywait

于 2020-10-30T16:26:39.973 回答
1

是的,它的编写方式continue很关键,因为您要确保enter调用有一个leave调用。既然你在考试enter前打电话if,那么你必须leavecontinue. 如果您没有该continue语句,它将继续执行leave已经调用的后续代码。

但是,如果您只是在语句之​​后调用,则不需要此leave/模式:continueenter if

let group = DispatchGroup()

for object in objects {    
    if object.property == nil {
         continue
    }

    group.enter()

    // do something with object and call group.leave() when finished
}
group.notify(queue: .main) { ... }

然后我会更进一步,if并在continue声明中删除它。只需在循环中添加一个where子句,就完全for不需要了continue

let group = DispatchGroup()

for object in objects where object.property != nil {
    group.enter()

    // do something with object and call group.leave() when finished
}

group.notify(queue: .main) { ... }

这完成了您的原始代码片段所做的事情,但更简洁。

于 2020-11-01T19:12:20.907 回答