LoginSignup
0
0

More than 5 years have passed since last update.

NotificationCenterとFuture

Posted at

この記事は落書きです

Future

Futureを使うと簡単になるのではという問題に直面したので、Futureというものを自分で作りながらお勉強しています。

今のところこんな感じのインターフェイスになっています。

class Future<T> {
  init(_ queue: DispatchQueue = default, _ block: @escaping () throws -> T)

  @discardableResult
  func onSucces(_ block: @escaping (T) -> Void) -> Self
  @discardableResult
  func onFailure(_ bloc: @escaping (Error) -> Void) -> Self

  func success(_ value: T)
  func failure(_ error: Error)

  func map<U>(_ transform: @escaping (T) throws -> U) -> Future<U>
  func flatMap<U>(_ transform: @escaping (T) -> Future<U>) -> Future<U>
}

バカなのでPromiseの必要性が分からないため混ざってます。

Notification

上のFutureをもとにNotificationを受けると値が確定するFutureがもらえるものを作りました。

extension NotificationCenter {

  // block: 戻り値がFutureの値となる。
  //        例外が投げられると投げられたエラーでFutureが確定する。
  //        戻り値がnilの時はNotificationの監視を継続する。
  func future<T>(forName name: Notificaion.Name,
                 object: Any?,
                 queue: OperationQueue?,
                 block: @escaping (Notification) throws -> T?) {

    let future = Future<T>()

    weak var token: NSObjectProtocol?
    token = addObserver(forName: name, object: object, queue: queue) { notification in
      do {
        guard let value = try block(notification) else { return }
        future.success(value)
      } catch {
         future.failure(error)
      }
      token.map(self.removeObserver)
   }

   return future
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0