Pau*_* T. 4 closures publisher ios swiftui combine
如何转换:
func getResults(completion: ([Result]?, Error) -> Void)
Run Code Online (Sandbox Code Playgroud)
进入
var resultsPublisher: AnyPublisher<[Result], Error>
Run Code Online (Sandbox Code Playgroud)
只是一个我如何看待它的方案(此语法不存在):
var resultsPublisher: AnyPublisher<[Result], Error> {
let publisher: AnyPublisher = ... // init
getResults { results, error in
guard let results = results else {
publisher.produce(error: error) // this syntax doesn't exist
return
}
publisher.produce(results: results) // this syntax doesn't exist
}
return publisher
}
Run Code Online (Sandbox Code Playgroud)
我需要它,因为一些 3d 方 SDK 使用completion closures,我想为它们编写扩展,返回Publishers.
答案是FuturePublisher ,matt解释如下:
var resultsPublisher: AnyPublisher<[Result], Error> {
// need deferred when want
// to start request only when somebody subscribes
// + without Deferred it's impossible to .retry() later
Deferred {
Future { promise in
self.getResults { results, error in
guard let results = results else {
promise(.failure(error))
return
}
promise(.success(results))
}
}
}
.eraseToAnyPublisher()
}
Run Code Online (Sandbox Code Playgroud)