如果我的DispatchGroup从未完成,会发生什么

时间:2018-09-17 06:47:27

标签: ios swift grand-central-dispatch

我有很多异步任务需要先完成才能继续,所以我使用的是DispatchGroup。但是,我能够确定其中一项任务是否尽早失败,因此通常会调用完成处理程序。

如果我通过调用完成处理程序离开函数的范围,那么DispatchGroup会发生什么?

是否永久分配了内存?

>如果最终(如果是由于错误)调用请假的次数足够长(可能是由于错误),是否有可能?

示例:

func example(completion: @escaping (Bool) - Void) {
    let group = DispatchGroup()

    group.enter()
    asyncFunction1 {
        if result == false {
            completion(false)
        } else {
            group.leave()
        }
    }

    group.enter()
    asyncFunction2 { result in
        if result == true {
            group.leave()
        }
    }

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

在上面的示例中,我有两个异步函数。第一个函数可能调用completion(false),第二个函数仅在成功时调用leave。虽然这可能不是最佳的代码示例,但这些条件是可能的。通知块会发生什么?

3 个答案:

答案 0 :(得分:2)

从GCD上的swift来源: https://github.com/apple/swift-corelibs-libdispatch/blob/master/src/semaphore.c

似乎该块将被分配并且永远不会释放。这意味着,该块保留的内存也将永远不会释放。

答案 1 :(得分:1)

  

我想知道从不打电话请假会发生什么。仅仅因为必须调用它,并不意味着它总是会被调用。

好吧,不要“从不打电话”。您必须安排您的代码,以便每个可能的退出路径都调用leave。如果不能,请不要使用调度组。

如有必要,可以将调度组本身传递到完成处理程序中,以便它可以为您调用leave。但是一种或另一种方式,请致电leave

答案 2 :(得分:-1)

每当代码块进入组以及每当代码块离开组时,都必须通知调度组。

这意味着,无论函数成功与否,都必须调用dispatchGroup.leave()

所有块完成后,调度组将得到通知。