Blocksのコールバックを使ってるとコールバック地獄に陥りやすいですよね。
(例:ボタンタップ→アラート確認→通信→通信結果を元に...)
この問題を解決する為のライブラリを作るにあたって、
参考にさせていただいたライブラリを尊敬の念をこめつつ以下に挙げておきます。
実現したいこと
引用ですが、以下のことをiOSで実現したいと考えています。
非同期処理を同期的に書く
「同期的に」とはどういうことか? 代表的な要件としては
- ネストが入れ子にならない
- 上から下に読んで実行フローが把握できる
- 非同期処理の結果得られた値を次の処理に引き回せる
- try/catchで素直に例外を捕捉できる
[generatorとJavaScriptの非同期処理]
(http://qiita.com/hitsujiwool/items/316f3e8a41fb7dc3a119)
future/promise, jQuery.Deferredについて
既存のiOSライブラリは、ほとんどがJavascript界隈での同種の問題解決に用いられているjQuery.Deferred
(future/promiseパターンを実装したもの)を参考にしているようです。
これらの理解が無かった場合、ライブラリの解読と使用は苦労すると思います。(経験談)
僕が勉強させていただいたサイトを載せておきます。
では以下ライブラリ一覧
#STDeferred
https://github.com/saiten/STDeferred
2012年という先見性と使い勝手に脱帽。
UIパーツに持たせてUIパーツのイベント発火まで一連の処理を待たせるなんかも出来る。
ただ、コードが僕のような中の下レベルでは難解。(pipe周り)
参考
Objective-CでDeferredライブラリを作ってみた
#Bolts-iOS
https://github.com/BoltsFramework/Bolts-iOS
最近(2014年2月)発表されたParse社(現 Facebook傘下)のフレームワーク。
Androidなんかのもある。
https://github.com/BoltsFramework
参考記事
Parse、iOSとAndroid用の低レベルライブラリ集、Boltsを発表
#OMPromises
https://github.com/b52/OMPromises
CommonJSのPromises/Aにインスパイアされたそうです。
比較的コードが追いやすい。勉強になります。
#Sequencer
https://github.com/berzniz/Sequencer
コードが超シンプル。やれる事もシンプル。
潔さも勉強になる。
#KSDeferred
https://github.com/kseebaldt/deferred
詳細不明。
#objc-promise
https://github.com/mproberts/objc-promise#objc-promise
詳細不明。
#MAFuture
https://github.com/mikeash/MAFuture
詳細不明。
2010年に作られている。知ってる中では一番早い。
MRC(not ARC)。
#PromiseKit
https://github.com/mxcl/PromiseKit
最近(2014年5月時点)出てきた模様。
サイトもある。
Swift対応してる!
##その他の方法
アプローチは上記ライブラリとは違ってきますが、ReactiveCocoaでも実現可能なのでは?と思ってます。
(検証していません)
https://github.com/ReactiveCocoa/ReactiveCocoa
ReactiveCocoaとFunctional Reactive Programmingについて
##参考
以下が興味深く読めて勉強になりました。
- コールバック……駆逐してやる…この世から…一匹…残らず!!
- 結局jQuery.Deferredの何が嬉しいのか分からない、という人向けの小話
- [generatorとJavaScriptの非同期処理]
(http://qiita.com/hitsujiwool/items/316f3e8a41fb7dc3a119)
##自作してみた
自作したものを公開してみました。
明らかに参考にしたライブラリには劣りますが、分かりやすい実装にはなったかなと。
よかったら見てみて下さい。指摘等頂ければ感謝します。