当一个函数需要前一个函数的值时,用于 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)
}
}
我有以下获取时间表的代码
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)
}
}