合并:将闭包转换为发布者

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.

Pau*_* T. 7

答案是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)