4

Combine として使用できるように、単純なコールバックをラップしたいと思いますPublisher。具体的にはNSPersistentContainer.loadPersistentStoreコールバックを使用して、コンテナーの準備が整ったときに公開できるようにします。

func createPersistentContainer(name: String) -> AnyPublisher<NSPersistentContainer, Error> {
  // What goes here?
  // Happy path: send output NSPersistentContainer; send completion.
  // Not happy path: send failure Error; send completion.
}

たとえば、createPersistentContainer上記の関数の内部構造はどのように見えるでしょうかAppDelegate

final class AppDelegate: UIResponder, UIApplicationDelegate {

  let container = createPersistentContainer(name: "DeadlyBattery")
    .assertNoFailure()
    .eraseToAnyPublisher()

  // ...

}

ほとんどの場合、これは次のように要約されますPublisher

4

3 に答える 3

7

コンバインFutureはその仕事に適したツールのようです。

func createPersistentContainer(name: String) -> AnyPublisher<NSPersistentContainer, Error> {
  let future = Future<NSPersistentContainer, Error> { promise in
    let container = NSPersistentContainer(name: name)
    container.loadPersistentStores { _, error in
      if let error = error {
        promise(.failure(error))
      } else {
        promise(.success(container))
      }
    }
  }
  return AnyPublisher(future)
}
于 2019-07-03T17:25:39.633 に答える