私はかなり新しくPromiseKit
、プロミスラップされたデリゲートシステム(UIALertView + PromiseKitなど)の予期しない動作の解決策を見つけようと数日間試みてきましたPMKLocationManager
。
アプリのセットアップ プロセスのかなり典型的なシナリオでは、アプリの読み込み時にユーザーが実行しなければならない一連の操作を連鎖させようとしています。この例のために、ケースを 2 つのステップのみに制限しましょう。ユーザーを Restful システムにログインさせた後、alertView を提示し、ユーザーの操作を待機します。
以下は私のコードです。
LoginToService は、MCUser を
PromiseKit
. これは期待どおりに機能し、ユーザーがログインすると元に戻るか、エラーで失敗します。ログイン成功の 'then' 句では、alert.promise() を介して約束されたバージョンを返すことで、alertView を提示します。
PromiseKit の実装に従って、ユーザーがボタンをクリックしてそれを閉じると、アラートの約束が満たされる必要があります。デリゲート システム ラッパー: これは、alert.promise().then を使用して Promises のチェーンを開始したときに観察された動作に問題なく動作します -
// Doesn't work: alert.promise returns immediately let user = MCUser.sharedInstance() user.logInToService(.RestServiceOne, delegate: self).then { _ -> AnyPromise in MCLogInfo("LogInToService: Promise fulfilled") let alert = UIAlertView(title: "Title", message: "Msg", delegate: nil, cancelButtonTitle: "Cancel", otherButtonTitles: "Hello") return alert.promise() }.then { (obj:AnyObject) -> Void in print("Clicked") }.finally { print("Finally") }.catch_ { error in print("Error") }
私が観察したことは、ユーザーがクリックするのを待たずにチェーンがすぐに継続し、「クリックされました」および「最終的に」メッセージがコンソールに出力され、画面上のアラートがアクションを待っていることです。Promise チェーンの先頭にない場合、使用することを意図していないデリゲート システム ラッパーが明らかに不足していますか?
ヒントを事前にありがとう