新的Xcode 11 beta 4已从Combine框架中删除了Publishers.Once
结构。有什么选择?
Just
似乎是可能的候选者,但是,它不能用于返回类型为AnyPublisher<Bool, Error>
且与Failure
{{ 3}}
例如,在以下方法中,由于关联的Just
类型不是Publishers.Once
,因此我可以返回Failure
。
Never
但是现在当我将其更改回func startSignIn() -> AnyPublisher<Void, Error> {
if authentication.provider == .apple {
let request = ASAuthorizationAppleIDProvider().createRequest()
request.requestedScopes = [.email, .fullName]
let controller = ASAuthorizationController(authorizationRequests: [request])
controller.delegate = self
controller.performRequests()
return Publishers.Once(()).eraseToAnyPublisher()
} else {
return SignInManager.service.startSignIn(auth: authentication)
.map { (auth) -> Void in
self.authentication = auth
}.eraseToAnyPublisher()
}
}
时,我收到一个编译错误,抱怨无法返回Just
,因为该方法应返回具有关联的Just
类型的发布者。
Failure
func startSignIn() -> AnyPublisher<Void, Error> {
if authentication.provider == .apple {
let request = ASAuthorizationAppleIDProvider().createRequest()
request.requestedScopes = [.email, .fullName]
let controller = ASAuthorizationController(authorizationRequests: [request])
controller.delegate = self
controller.performRequests()
return Just(()).eraseToAnyPublisher() //Error Here
} else {
return SignInManager.service.startSignIn(auth: authentication)
.map { (auth) -> Void in
self.authentication = auth
}.eraseToAnyPublisher()
}
}
是否没有其他选择也可以具有关联的故障类型?
答案 0 :(得分:5)
您不再需要Once
,因为在beta 4中,Combine向标准库Publisher
类型添加了publisher
类型和Result
属性。现在,您可以执行以下操作:
return Result.Publisher(()).eraseToAnyPublisher()
您也可以这样写:
return Result.success(()).publisher.eraseToAnyPublisher()
答案 1 :(得分:2)
setFailureType(to:)
可以解决某些特殊情况:
return Just(()).setFailureType(to: Error.self).eraseToAnyPublisher()
但是请注意,Rob的答案通常更可取。那更简单,也许更快。