如果您在Playgroud中尝试以下代码:
import Combine
import Foundation
struct User {
let name: String
}
private var subscriptions = Set<AnyCancellable>()
var didAlreadyImportUsers = false
var users = [User]()
func importUsers() -> Future<Bool,Never> {
Future { promise in
DispatchQueue.global(qos: .userInitiated).async {
sleep(5)
users = [User(name: "John"),User(name: "Jack")]
promise(.success(true))
}
}
}
func getUsers(age: Int? = nil) ->Future<[User],Error> {
Future { promise in
promise(.success(users))
}
}
var usersPublisher: AnyPublisher<[User],Error> {
if didAlreadyImportUsers {
return getUsers().eraseToAnyPublisher()
} else {
return importUsers()
.setfailureType(to: Error.self)
.combineLatest(getUsers())
.map { $0.1 }
.eraseToAnyPublisher()
}
}
usersPublisher
.sink(receiveCompletion: { completion in
print(completion)
},receiveValue: { value in
print(value)
}).store(in: &subscriptions)
它将打印:
[]
finished
但我希望:
[User(name: "John"),User(name: "Jack")]
finished
如果我删除带有sleep(5)
的行,则它将正确打印结果。似乎是异步问题。似乎.combineLatest(getUsers())
不在等待importUsers()
我以为combineLatest
正在照顾那个?我在这里想念什么?
(在我的真实代码中,Core Data操作长期运行,而不是sleep
)