当一个函数需要前一个函数的值时,用于 Firebase 实时数据库查找的完成处理程序

Completion handler for Firebase Realtime DB lookup when one function needs the value of a previous function

我有以下获取时间表的代码

func fetchSchedule(completion: @escaping () -> ()) {
    
    scheduleRef.queryOrderedByValue().queryEqual(toValue: true).observe(.value, with: { snapshot in

        self.schedule = []
        
        if snapshot.value is NSNull {
            // Null
            
        } else {
            
            for child in snapshot.children {
                        
                if let snapshot = child as? DataSnapshot,
                        
                   let schedule = Schedule(snapshot: snapshot) {
                            
                       self.schedule.append(schedule)
                            
                }
                        
            }

        }

    })
    
}

上面得到了当前的时间表,但我不清楚的是我需要那个值来调用下一个函数调用,该函数调用在 SwiftUI 视图的 .onAppear() 上获取该时间表的相关游戏

func getGames() {

    scheduleStore.fetchSchedule()
    //
    gameStore.fetchGames(weekId: self.scheduleStore.schedule[0].weekId)

}

gameStore.fetchGames总是returnsnull,可能是因为它还没有处理完fetchSchedule函数?

如何确保第一个函数在调用 fetchGames 之前完成?

您在 fetchSchedule 上的函数签名中内置了一个完成处理程序,但您没有使用它。

func fetchSchedule(completion: @escaping () -> ()) {
    
    scheduleRef.queryOrderedByValue().queryEqual(toValue: true).observe(.value, with: { snapshot in

        self.schedule = []
        
        if snapshot.value is NSNull {
            // Null
            
        } else {
            
            for child in snapshot.children {
                        
                if let snapshot = child as? DataSnapshot,
                        
                   let schedule = Schedule(snapshot: snapshot) {
                            
                       self.schedule.append(schedule)
                            
                }
                        
            }

            completion() //<-- Here

        }

    })
    
}

然后,

func getGames() {
    scheduleStore.fetchSchedule(completion: {
       gameStore.fetchGames(weekId: self.scheduleStore.schedule[0].weekId)
    })
}

您没有显示所有代码,但您在 fetchSchedule 中设置的 self.schedule 和您发送给 self.scheduleStore 之间可能还有一些错误fetchGames -- 确保只有一个地方存储数据 -- 两个地方都应该是 self.schedule 吗?


根据评论更新

此代码是近似代码,因为我无法访问您的类型,但它应该可以帮助您入门:

func fetchSchedule(completion: @escaping ([Schedule]) -> ()) {
    
    scheduleRef.queryOrderedByValue().queryEqual(toValue: true).observe(.value, with: { snapshot in
        
        if snapshot.value is NSNull {
            // Null
            
        } else {
            
            let schedules = snapshot.children.compactMap { child in
               if let snapshot = child as? DataSnapshot, let schedule = Schedule(snapshot: snapshot) {
                  return schedule
               }
               return nil
            }

            completion(schedules)

        }

    })
    
}
func getGames() {
    scheduleStore.fetchSchedule { schedules in
       gameStore.fetchGames(weekId: schedules[0].weekId)
    }
}