Ios 如何使用调度组同时开始加载?

Ios 如何使用调度组同时开始加载?,ios,swift,grand-central-dispatch,swift5,Ios,Swift,Grand Central Dispatch,Swift5,为了更快地加载,我想使用dispatch group,但在这种情况下如何做到这一点 同时,我想开始加载workoutRepository和streakRepository private func loadDailyWorkout(completion: @escaping ((DailyWorkout) -> Void)) { workoutRepository.load { [weak self] (result) in switch result {

为了更快地加载,我想使用dispatch group,但在这种情况下如何做到这一点

同时,我想开始加载workoutRepository和streakRepository

private func loadDailyWorkout(completion: @escaping ((DailyWorkout) -> Void)) {
    workoutRepository.load { [weak self] (result) in
        switch result {
        case .success(let list):
            if list.isEmpty {
                self?.shouldShowWorkoutUnlockedScreen = true
            }
            self?.streakRepository.load { (result) in
                switch result {
                case .success(let streak):
                    let workout = DailyWorkout(streak: streak, tricks: list)
                    completion(workout)
                case .failure:
                    let workout = DailyWorkout(streak: Streak.initial, tricks: list)
                    completion(workout)
                }
            }
        default:
            completion(DailyWorkout(streak: Streak.initial, tricks: []))
        }
    }
}
这是一张草图:

private func loadDailyWorkout(completion: @escaping ((DailyWorkout) -> Void)) {
    myBackgroundQueue.async {
        let group = DispatchGroup()
        var streak = // Optional of the right type, initially nil
        var list = // Optional of the right type, initially nil
        group.enter()
        workoutRepository.load { result in {
            // do stuff; set list
            group.leave()
        }
        group.enter()
        streakRepository.load { result in
            // do stuff; set streak
            group.leave()
        }
        group.notify(queue: .main) { 
            // can see streak and list
            // so now go ahead and do your callback
        }
    }
}
两个
load
命令都是同时执行的,但在这两个命令都完成之前,我们不会继续(
notify


请注意,我首先将我们放在后台队列中,因为我们不能在主队列中“等待”。在您的情况下,这可能不是必需的。

问题是,如果
workoutRepository
成功,您只需在代码中加载
strokepository
。只要你对事情施加限制,你就不能同时做。但是如果你愿意同时做这两件事,不管其中一件成功与否,那么就使用DispatchGroup,就像你说的那样。@matt你能给我举个例子吗?因为这些调度组让我有点头疼:)谢谢!只是还有疑问。两人都应该每天回来锻炼。两者都需要两个参数:条纹和技巧。所以一种方法加载条纹,另一种加载技巧。如何在小组中使用。通知,这样我就可以在一个地方同时获得连胜和技巧了?这是目前我面临的最大问题:)本地(与
相同级别,让group
)声明可选变量,并在
加载
完成处理程序中设置它们。因此,当您到达
组.notify
完成处理程序时,这些选项要么仍然是
nil
,要么是由
load
完成处理程序设置的,这就是您想做什么就做什么的地方(通过训练调用整体完成)。我还想说,如果您使用的是iOS 13及更高版本,则Combine框架为您提供了一种更清晰的方式来表达这类内容。修改了我的草图,以显示如何将
加载
结果传达给
组。通知
。啊,好的!多谢各位!事实上,我在想这个,但我认为有一个更干净的方法来做到这一点!再次感谢您的时间和帮助;)