【问题标题】:Swift -is it necessary to call continue when leaving a dispatchGroupSwift - 离开 dispatchGroup 时是否需要调用 continue
【发布时间】:2020-10-30 16:17:07
【问题描述】:

我有一组对象,我必须使用 for-loopDispatchGroup 进行迭代。离开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(...

【问题讨论】:

  • 顺便说一句,你提到“用对象做某事”......不用说,如果那个“某事”不是异步的,那么你根本不应该使用组。跨度>
  • @Rob 谢谢,我想让代码尽可能简单,只是为了直截了当。我不会将它用于常规循环。我实际上用它从 Firebase 中提取一些数据,我必须通过多个参考,例如 postsRef > blockedRef > userIdRef > followingRef
  • 有道理。

标签: ios swift grand-central-dispatch dispatchgroup


【解决方案1】:

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

调用DispatchGroup.leave 不会退出当前作用域,您需要调用continue 来实现。 leave 只会影响您使用 DispatchGroup 所做的任何事情 - 因此会导致 notifywait 调用。

【讨论】:

    【解决方案2】:

    是的,按照这种方式编写,continue 至关重要,因为您要确保 enter 调用有一个 leave 调用。由于您在if 测试之前调用enter,那么您必须leavecontinue。如果您没有continue 语句,它将继续执行已调用leave 的后续代码。

    但是如果您只是在if 语句之后调用enter ,则不需要这种leave/continue 模式:

    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。只需在for 循环中添加where 子句,就完全不需要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) { ... }
    

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

    【讨论】:

    • 嗨,快速提问。当在循环中使用where 子句(如for object in objects where object.postId == postId { })时,如果循环找到它要查找的内容,是否需要添加break?如果没有where,一旦找到它,调用break 退出循环,因为不需要进一步迭代。但是我不清楚where是否会自动触发break
    • 这取决于您的意图。如果你真的只想在第一次匹配时这样做,那么整个调度组模式就没有意义了。调度组的目的是知道所有异步任务何时完成。一个“组”没有多大意义。大声笑。
    • 哦,对不起,我应该更清楚,我的意思是没有 DispatchGroup,只是一个常规的 for 循环。你说得对,一组没有意义,哈哈
    • 如果你只想要第一个,你可能也不会使用for 循环,即使有where 子句。如果您只想要与您的where 子句匹配的第一个条目,则仅first(where:) 可能是合适的。
    • 嗯,你说得对,谢谢!我有一堆 for 循环,我在其中搜索一个条目并使用 break。我从没想过使用first(where)。谢谢你的建议:)
    猜你喜欢
    • 1970-01-01
    • 2016-11-09
    • 2014-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-14
    • 2021-01-02
    • 1970-01-01
    相关资源
    最近更新 更多