使用Combine Swift将flatMap块中的字符串保存到api调用中的数据库中



我正试图从本地数据库中获取一个值,当找不到时,我想将其保存到本地数据库并返回。所有这些我都在交互程序文件中完成,实际的保存或获取是在单独的文件中完成的。以下是我的代码:

public func fetchCode(codeId: String) -> AnyPublisher<String?, Error> {
//Get code from localdb
codeStorageProvider.fetchCode(codeId).flatMap { (code) -> AnyPublisher<String?, Error> in
if let code = code {
return Just(code).mapError{ $0 as Error }.eraseToAnyPublisher()
}
//If not found in db, Get code from server
let code = self.voucherCodeProvider.fetchVoucherCode(codeId: codeId)
return code.flatMap { code in
//save the code to local db
self.codeStorageProvider.saveVoucherCode(code, codeId)
return code
}.eraseToAnyPublisher()
//return code to presenter
}.eraseToAnyPublisher()
}

我在flatMap中得到以下错误:

如果没有更多上下文,表达式类型不明确

有人能帮我吗?

如果您的saveVoucher没有返回发布服务器,并且您不想知道操作何时完成,则不需要使用flatMap,但您可以使用handleEvents并调用副作用来保存代码。类似这样的东西:

func fetchLocal(codeId: String) -> AnyPublisher<String?, Error> {
return Empty().eraseToAnyPublisher()
}
func fetchRemote(codeId: String) -> AnyPublisher<String, Error> {
return Empty().eraseToAnyPublisher()
}
func saveLocal(code: String, codeId: String) {
// Save to BD
}
func fetch(codeId: String) -> AnyPublisher<String?, Error> {
return fetchLocal(codeId: codeId)
.flatMap { code -> AnyPublisher<String, Error> in
if let code = code {
return Just(code)
.setFailureType(to: Error.self)
.eraseToAnyPublisher()
} else {
return fetchRemote(codeId: codeId)
.handleEvents(receiveOutput: {
saveLocal(code: $0, codeId: codeId)
})
.eraseToAnyPublisher()
}
}
.map(Optional.some)
.eraseToAnyPublisher()
}

相关内容

  • 没有找到相关文章

最新更新