'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()
但请注意,罗布斯的回答通常更可取。那更简单,而且可能更快。
新的 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()
但请注意,罗布斯的回答通常更可取。那更简单,而且可能更快。