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

What’s the alternative for 'Publishers.Once'?

新的 Xcode 11 beta 4 已从 Combine 框架中删除 Publishers.Once 结构。还有什么选择?

Just 似乎是可能的候选者,但是,它不能用于 return 在方法中使用 return 类型 AnyPublisher<Bool, Error> 作为关联 [=16] 的发布者=] 输入 Just is Never.

例如在下面的方法中,我可以 return 一个 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 不能 returned,因为该方法应该 return 一个发布者关联的 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 的替代方法,它也可以有关联的故障类型?

在 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()

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

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

但请注意,罗布斯的回答通常更可取。那更简单,而且可能更快。