我PromiseKit
还很陌生,而且我已经尝试了几天来找出一个解决方案,以解决承诺包装的委托系统(UIALertView+PromiseKitPMKLocationManager
等)的意外行为。
在我相当典型的应用程序设置过程场景中,我试图链接用户在应用程序加载时必须执行的一系列操作。为了这个例子,让我们将案例限制为只有两个步骤:将用户登录到一个 Restful 系统,然后显示一个 alertView 并等待用户的交互。
下面是我的代码,其中:
LoginToService 是通过扩展 MCUser 获得的基于块的方法的可承诺版本
PromiseKit
。这可以按预期工作,并在用户登录后返回,或者因错误而失败。在成功登录的“then”子句中,我通过 alert.promise() 返回其承诺版本来呈现一个 alertView。
我希望在调用连续的 .then 子句(最后是“finally”子句)之前实现该承诺 - 根据 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 链的开头,我是否显然遗漏了某些东西,或者那些不打算使用的委托系统包装器?
提前感谢您的任何提示