'Publishers.Once'的替代方案是什么?

时间:2019-07-19 04:48:05

标签: swift combine

新的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() } } 是否没有其他选择也可以具有关联的故障类型?

2 个答案:

答案 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的答案通常更可取。那更简单,也许更快。