Takahiro Octopress Blog

-1から始める情弱プログラミング

PromiseKitを使ってみよう!

| Comments

SwiftでPromiseライブラリを使ってみよう

さて、前回から引き続きSwiftでのPromiseライブラリについて見ていきたいと思います。
今回はPromiseライブラリのSwift界隈で有名な PromiseKit について見ていきます。

PromiseKitのインストール

早速、 PromiseKit の導入について紹介します。
筆者の場合、Xcode7.3を利用しているため、Swift2.2を扱うことになります。
GitHubで紹介されている下記の導入方法では 2.2.1 がインストールされます。
しかし、このバージョンはSwift2.2に対応していないため、エラーが発生します。

1
2
3
use_frameworks!

pod "PromiseKit", "~>2.0"

PromiseKitの公式ドキュメントページを見ると、Newsの項目でバージョン 3.1.0 でSwift2.2に対応したと書かれています。
そこで、今回は、

1
2
3
use_frameworks!

pod "PromiseKit", "3.1.0"

とすることで、Xcode7.3でも問題なく、PromiseKitを扱えるようにしました。

PromiseKitで非同期処理を直列に書いてみよう

前回のBrightFutureで紹介した処理をPromiseKitで書いてみようと思います。
まずは、非同期処理をPromiseKitを使って定義します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
func p(msg: String) -> Promise<String>{

  let promise = Promise<String> { (fulfill, reject) in
      let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
      dispatch_async(queue, {
          sleep(1)
          dispatch_sync(dispatch_get_main_queue(), {
              print(msg)
              fulfill(msg)
          })
      })
  }
                                                  
  return promise
}

では、これを呼び出してみましょう。

1
2
3
4
5
p("Hello").then { (msg1) -> Promise<String> in
  return p("Good Evening")
}.then { (msg2) -> Promise<String> in
  return p("Good Bye")
}

ネストが浅い状態で複数の非同期処理を書くことができました。
また、BrightFutureと大きな違いはなく書くことできました。

PromiseKitで非同期処理を並列に書いてみよう

続いて、複数の非同期処理を並列に実行する場合を考えてみます。
順番に処理をする必要がなく、処理が完了したものから反映していきたい場合などに使いますね。

非同期処理自体は先程と同じものを使います。
では、並列に処理を呼び出してみましょう。

1
2
3
4
5
6
7
8
9
// 実行したい非同期処理を定義
let p1 = ps.p_promiseKit("Method1")
let p2 = ps.p_promiseKit("Method2")
let p3 = ps.p_promiseKit("Method3")

// まとめて非同期処理を実行
when([p1, p2, p3]).then { (result: [String]) -> AnyPromise in
  return AnyPromise(bound: Promise())
}

先に書いた直列処理では、1秒間隔でログが出力されたかと思います。
ここでは同時に実行したため、ほぼ同時に3つのログが出力されたはずです。

さて如何だったでしょうか?
SwiftでもPromiseライブラリはたくさん出てきました。
BrightFuture, PromiseKit, SwiftTaskのいずれを利用するかは開発者の判断になるかと思います。
個人的にはPromiseKitはGitHub上に似た名称のブランチがたくさんあるのをどうにかして欲しいなと思ってたりします笑

また、時間があるときにPromiseを使って何かやりたいと思います。
と言ったところで本日はここまで。

Comments