AnyPublisher 的 Swift 5.5 异步等待方法

cra*_*777 3 async-await swift combine

我试图在应该返回 AnyPublisher 的方法中调用 Swift 5.5 异步抛出方法,但我很难实现这一点。我尝试使用Future(promise),但不起作用,我只设法找到一个 Swift 5.5 API 将基于闭包的方法转换为异步方法。

class Loader {

    func loadSomeData() -> async throws [String] {
        /// some code
    }
}

class Service {
   let loader: Loader
   init(loader: Loader) { 
      self.loader = loader
   }

   func someDataPublisher() -> AnyPublisher<[String], Error> {
       // How can I convert this?
       try await loader.loadSomeData() 
   }
}
Run Code Online (Sandbox Code Playgroud)

rob*_*off 8

class Service {
   let loader: Loader
   init(loader: Loader) {
      self.loader = loader
   }

   func someDataPublisher() -> AnyPublisher<[String], Error> {
       return Deferred { [loader] in
           Future { promise in
               Task {
                   do {
                       promise(.success(try await loader.loadSomeData()))
                   } catch {
                       promise(.failure(error))
                   }
               }
           }
       }
       .eraseToAnyPublisher()
   }
}
Run Code Online (Sandbox Code Playgroud)

  • 如果没有“Deferred”,它会立即调用“loader.loadSomeData()”,即使您最终没有订阅。使用“延迟”,它会等待您订阅。 (2认同)