Swift - необходимо вызывать continue при выходе из группы dispatchGroup

У меня есть группа объектов, которые мне нужно перебирать, используя for-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(...

2 ответа

Решение

Да, позвонить обязательно continue, поскольку вы хотите избежать продолжения выполнения тела вашего цикла.

Вызов DispatchGroup.leave не выходит из текущей области, вам нужно вызвать continue чтобы добиться этого. leave влияет только на то, что вы делаете с DispatchGroup - так последовательный notify или же wait звонки.

Да, как это написано, continue очень важно, так как вы хотите убедиться, что enter звонок имеет один leaveвызов. Поскольку ты звонишь enter перед if тест, тогда ты должен leave и continue. Если у вас нет continue оператор, он продолжит следующий код, который вызывает leave уже.

Но это leave/continue шаблон не нужен, если вы просто звоните enter после того, как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) { ... }

Это выполняет то, что делал ваш исходный фрагмент кода, но является более кратким.

Другие вопросы по тегам