“Publishers.Once”有什么替代方案?

9
新的Xcode 11 beta 4已从Combine框架中删除了Publishers.Once结构体。有什么替代方案? Just似乎是最合适的候选项,但它不能用于返回类型为AnyPublisher<Bool, Error>的方法,因为与Just相关联的Failure类型Never 例如,在下面的方法中,我可以返回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()
    }
}

有没有替代方案可以像 Publishers.Once 一样具有相关的故障类型?

2个回答

19
在 Xcode 11 beta 4 中,Publishers.Once 被重命名为 Result.Publisher(其中 Result 是标准库的一部分)。因此,请改为编写以下代码:
return Result.Publisher(()).eraseToAnyPublisher()

苹果还向Result添加了一个publisher属性,如果您已经有一个Result,这将非常方便:

let result: Result<Void, Error> = someFunction()
return result.publisher.eraseToAnyPublisher()

非常感谢,我已经寻找了两天。 - crashoverride777

5

setFailureType(to:)在某些特定情况下可能是一种解决方案:

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接