7

新的 Xcode 11 beta 4 已经Publishers.Once从 Combine 框架中移除了 struct。什么是替代方案?

Just似乎是可能的候选者,但是,它不能用于在返回类型AnyPublisher<Bool, Error>作为关联Failure类型的方法中返回发布者Just is Never

例如在下面的方法中,我可以返回 aPublishers.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()
    }
}

是否有任何替代方案Publishers.Once也可以具有相关的故障类型?

4

2 回答 2

16

在 Xcode 11 beta 4 中,Publishers.Once被重命名Result.Publisher(其中Result是标准库的一部分)。所以改为这样写:

return Result.Publisher(()).eraseToAnyPublisher()

Apple 还为 增加了一个publisher属性Result,如果你已经有一个,这很方便Result

let result: Result<Void, Error> = someFunction()
return result.publisher.eraseToAnyPublisher()
于 2019-07-19T05:05:29.453 回答
4

setFailureType(to:)可能是某些特殊情况的解决方案:

return Just(()).setFailureType(to: Error.self).eraseToAnyPublisher()

但请注意,Rob 的回答通常更可取。那更简单,可能更快。

于 2019-10-06T08:44:43.767 回答