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

标签 ios swift grand-central-dispatch

我有很多异步任务需要全部完成才能继续,所以我使用的是 DispatchGroup。但是,我能够判断其中一项任务是否提前失败,并且我通常会调用完成处理程序。

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

内存是永久分配的吗?如果最终调用 leave 的次数足够多(可能是由于错误),是否仍然可以调用通知 block ?

例子:

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。虽然它可能不是最好的代码示例,但这些条件是可能的。通知 block 会发生什么?

最佳答案

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

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

关于ios - 如果我的 DispatchGroup 从未完成会发生什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52362130/

相关文章:

iOS - 当搜索半径太宽时,GeoFire 异常抛出 'Precision must be less than 23!'

ios - NMSSHSession uploadFile EXC_BAD_ACCESS

ios - Swift SceneKit 照明和影响发射纹理

ios - 按顺序执行swift代码

iphone - AudioServicesPlaySystemSound 和主线程

ios - 滚动后,UICollectionViewCells中的AVPlayers最终会导致应用崩溃

iphone - MPMoviePlayer 不播放视频

ios - 什么是armv7s?

每次启动/重新运行应用程序时,iOS 文件路径都会发生变化

iOS:RestKit 操作阻止在我想要的时候执行