我想应用的逻辑是。
如果我们已经导入了用户,我们只需要获取他们,否则先导入用户,然后再获取他们。这是我的尝试。
import Combine
struct User {
let name: String
}
var didAlreadyImportUsers = false
// Import the users and return true of false
var importUsers: Future<Bool, Never> {
Future { promise in
promise(.success(true))
}
}
var fetchUsers: Future<[User], Error> {
Future { promise in
promise(.success([User(name: "John"), User(name: "Jack")]))
}
}
var users: Future<[User], Error> {
if didAlreadyImportUsers {
return fetchUsers
} else {
return importUsers.setFailureType(to: Error.self)
.combineLatest(fetchUsers)
.map { $0.1 }
}
}
我得到一个错误。
Cannot convert return expression of type
'Publishers.Map<Publishers.CombineLatest<Publishers.SetFailureType<Future<Bool, Never>, Error>, Future<[User], Error>>, [User]>'
to return type 'Future<[User], Error>'
Any idea how to get the result of chaining as Future<[User], Error> ?
很接近了! 只要擦掉类型就可以了。
var users: AnyPublisher<[User], Error> {
if didAlreadyImportUsers {
return fetchUsers.eraseToAnyPublisher()
} else {
return importUsers.setFailureType(to: Error.self)
.combineLatest(fetchUsers)
.map { $0.1 }.eraseToAnyPublisher()
}
}
你可能会说: 等等,我说的不是这样做,我想把它作为一个Future返回。好吧。不要 要的!它 是不是 你不想知道它是什么。你只想知道它的输出类型和失败类型。
这里的重点是,一个出版商和另一个出版商一样好;它们可以互换使用。只要它们的类型符合. 这就是为什么要提供AnyPublisher的原因:它是为了让你可以做到这一点。基本上,AnyPublisher就是你在出版商类型之间的投稿方式:你只需将所有的东西投稿到AnyPublisher。