【发布时间】:2021-05-27 13:15:47
【问题描述】:
我正在尝试加载或创建一个“季节”,它基本上是四分之一或一个月长的时间块,作为子集合文档存储在云 Firestore 中的用户配置文件中。
我在 Season 子集合中有一个“order”字段,随着每个新创建的季节而增加,我的查询只是找到最近的一个。
我调用这个函数 (loadOrCreateCurrentSeason) 来加载最近的季节,它返回一个组合未来——我的数据模型中的一个季节或一个错误,它会订阅它。只要没有错误,它就会返回它找到的季节,只要它返回的季节包含当前日期。
如果其中任何一个不正确,它将创建一个新文档并将该文档添加到 Firebase。
我遇到的问题是,在我用来返回最新季节的辅助函数中,当它加载文档并尝试将其转换为我的应用程序的季节模型 (let x = try document.data(as: Season.self) 时,我的应用程序保留返回 x 为零。
我不确定这是否是我的查询错误,或者我如何设置函数以将数据作为季节返回,但我想知道其中是否有任何可能阻止应用程序将 Firestore 文档转换为季节?
Repository 初始化时调用的主函数:
func loadOrCreateCurrentSeason() {
var _ = loadMostRecentSeason()
.sink(receiveCompletion: { error in
self.addSeasonToSubcollection(season: Season(lastOrder: 0))
}, receiveValue: { [weak self] season in
if season.endDate < Date() {
let oldOrder = season.order
self?.saveCurrentSeasonToPast()
self?.currentSeason = self?.createCurrentSeason(order: oldOrder)
self?.addSeasonToSubcollection(season: season)
} else {
self?.currentSeason = season
}
})
.store(in: &cancellables)
}
调用帮助函数以专门从 Firebase 加载最新季节:
func loadMostRecentSeason() -> Future<Season, ErrorLoadingSeason> {
let seasonRef = db.collection("users").document(userProfile.id!).collection("season")
return Future<Season, ErrorLoadingSeason> { promise in
seasonRef.order(by: "order", descending: true)
.limit(to: 1)
.getDocuments() { (querySnapshot, err) in
if let err = err {
print("Error getting most recent season: \(err.localizedDescription)")
promise(Result.failure(ErrorLoadingSeason.NoSeasonFound))
} else {
for document in querySnapshot!.documents {
do {
let x = try document.data(as: Season.self)
if x != nil {
promise(Result.success(x!))
} else {
promise(Result.failure(ErrorLoadingSeason.NoSeasonFound))
}
} catch {
print("An error converting the most recent season")
print(error)
promise(Result.failure(ErrorLoadingSeason.couldNotConvertData))
}
}
}
}
}
}
如果这会有所不同,这是我的季节结构:
struct Season: Codable, Identifiable {
// Identifiers
@DocumentID var id: String?
var title: String?
var userId: String
var order: Int
//Completion Details
var startDate: Date
var endDate: Date
// var seasonType: SeasonType?
init(lastOrder: Int) {
let userProfile = CurrentUserProfile.shared.currentUser!
self.userId = userProfile.id!
self.startDate = Date().startOfPeriod(userProfile.seasonLength ?? .quarter)
self.endDate = Date().endOfPeriod(userProfile.seasonLength ?? .quarter)
self.order = lastOrder + 1
self.title = setTitle(userProfile: userProfile)
}
}
【问题讨论】:
-
您能否确认从 Firestore 检索到的信息是否正确?您提到当您尝试将其转换为您的应用程序模型时会出现问题,所以这正是问题所在?
-
是的,我在其中添加了一行以在 x 设置后打印它,看起来 x 实际上不是 nil,而是设置为某个值。我认为不是,但我认为我在错误的行上有一个断点。我想我找到了解决方案,这与我的接收完成有关。我会在下面发帖。感谢您的回复。
标签: swift google-cloud-firestore combine