Сделать издателя из обратного вызова - PullRequest
1 голос
/ 03 июля 2019

Я хотел бы обернуть простой обратный вызов, чтобы его можно было использовать в качестве комбайна 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?

1 Ответ

1 голос
/ 03 июля 2019

Похоже, что комбинат 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)
}
...