Ios Swift-离开调度组时是否需要呼叫continue

Ios Swift-离开调度组时是否需要呼叫continue,ios,swift,grand-central-dispatch,dispatchgroup,Ios,Swift,Grand Central Dispatch,Dispatchgroup,我有一组对象,必须使用for循环和DispatchGroup进行迭代。将组留在for循环中时,是否需要继续调用 let group = DispatchGroup() for object in objects { group.enter() if object.property == nil { group.leave() continue // does calling this have any effect even though

我有一组对象,必须使用for循环和DispatchGroup进行迭代。将组留在for循环中时,是否需要继续调用

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(...

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


调用DispatchGroup.leave不会退出当前作用域,您需要调用continue来实现这一点。“离开”只会影响您对DispatchGroup所做的任何操作,因此会导致notify或wait调用。

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


调用DispatchGroup.leave不会退出当前作用域,您需要调用continue来实现这一点。离开只会影响您对DispatchGroup所做的任何操作,因此会导致通知或等待呼叫。

是的,按照编写方式,继续是至关重要的,因为您希望确保enter呼叫有一个单独的离开呼叫。由于您在if测试之前调用enter,因此必须离开并继续。如果没有continue语句,它将继续执行调用leave的后续代码

但是,如果在if语句之后仅调用enter,则不需要此离开/继续模式:

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) { ... }
然后,我会更进一步,用continue语句删除if。只需将where子句添加到for循环中,就不需要继续:


这完成了原始代码段的功能,但更加简洁。

是的,按照编写方式,continue非常重要,因为您希望确保enter调用有一个leave调用。由于您在if测试之前调用enter,因此必须离开并继续。如果没有continue语句,它将继续执行调用leave的后续代码

但是,如果在if语句之后仅调用enter,则不需要此离开/继续模式:

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) { ... }
然后,我会更进一步,用continue语句删除if。只需将where子句添加到for循环中,就不需要继续:


这完成了您原来的代码片段所做的工作,但更加简洁。

顺便说一句,您提到了“使用对象做一些事情”。。。不用说,如果“something”不是异步的,那么就不应该使用组。@Rob谢谢,我想让代码尽可能简单,只是为了直截了当。我不会用这个来做常规循环。实际上,我用它从Firebase中提取一些数据,在Firebase中,我必须通过多个引用,例如postsRef>blockedRef>userIdRef>FollowRef,这很有意义。。。不用说,如果“something”不是异步的,那么就不应该使用组。@Rob谢谢,我想让代码尽可能简单,只是为了直截了当。我不会用这个来做常规循环。实际上,我用它从Firebase中提取一些数据,在Firebase中,我必须通过多个ref,例如postsRef>blockedRef>userIdRef>FollowRef,这很有意义。嗨,快速提问。当在循环中使用where子句作为对象where object.postId==postId{}中的for object时,如果循环找到它要查找的内容,是否需要添加中断?一旦找到它,调用break退出循环,因为不需要进一步迭代。但我不清楚哪里会自动触发中断。这取决于你的意图。如果您真的只想在第一场比赛中这样做,那么整个调度组模式就没有意义了。调度组的目的是了解所有异步任务何时完成。一个“群体”没有多大意义。哦,对不起,我应该说得更清楚,我的意思是没有调度组,只是一个常规的for循环。你是对的,一个组没有意义,如果你只想要第一个,你可能也不会使用for循环,即使使用where子句。如果您只需要与where子句匹配的第一个条目,Just可能是合适的。嗯,您说得对,谢谢!我有一堆for循环,其中我搜索一个条目并使用break。我从来没有想过使用firstwhere。谢谢你的建议:嗨,快速提问。当在循环中使用where子句作为对象where object.postId==postId{}中的for object时,如果循环找到它要查找的内容,是否需要添加中断?一旦找到它,调用break退出循环,因为不需要进一步迭代。但我不清楚哪里会自动触发中断。这取决于你的意图。如果您真的只想在第一场比赛中这样做,那么整个调度组模式就没有意义了。调度组的目的是了解所有异步任务何时完成。一个“团体”?