我正在处理我的应用程序的登录部分,我想过使用ReactiveCocoa 4. :)
这是我视图中的init:
self.viewModel.loginSignal = self.LoginButton.rac_signalForControlEvents(UIControlEvents.TouchUpInside)!
self.viewModel.loginStatus.producer.startWithNext({ status in
self.setLoginButtonStatus(status)
})
self.viewModel.initSignals()
setLoginButtonStatus
只会禁用/启用按钮等,而status
只是一个枚举。
这是我的视图模型initSignals()
self.loginSignal!.toSignalProducer().start({ sender in
self.validateLoginInput()
})
loginSignal
声明为var loginSignal: RACSignal?
。
这是我的validateLoginInput
self.loginStatus.value = MyStatus.Login.IN_PROGRESS // So button would be disabled
session.rac_dataWithRequest(request).map({ data, response in
return MyResponse(data, response)
}).startWithNext({ response
// Say MyResponse class would check the reponse if login is successful
if response.isSuccessful() {
self.loginStatus.value = MyStatus.Login.SUCCESS
} else {
self.loginStatus.value = MyStatus.Login.FAIL
}
})
视图应首先禁用该按钮,然后在会话结束时以及response.isSuccessful()
为真时重新启用它。
嗯,它现在有效,但我想知道我是否正确使用MVVM与ReactCocoa 4。
另外,我得到了一个让我感到困扰的“警告”。这似乎是HTTP请求获得响应后的第二个。
2015-12-02 12:15:32.566 MyProject[460:48610] This application is
modifying the autolayout engine from a background thread, which can
lead to engine corruption and weird crashes. This will cause an
exception in a future release.
是因为我在v4.0.0-alpha.4
上使用Swift 2.1
吗?这实际上会延迟重新启用我的按钮。
我对Web中的示例感到困惑,因为大多数都在Objective-C中,我认为某些函数名称已更改,等等...
非常感谢!
答案 0 :(得分:1)
其他人可以谈论您正在采取的 MVVM 方法,但关于您所看到的警告:那是因为您正在使用来自后台线程的UIKit 。我想这来自self.setLoginButtonStatus
电话。根据您对该属性的绑定的信号,它可能(并且在这种情况下发生)它的生成器发出的值不会在主线程上发出。< / p>
要解决此问题,您可以使用observeOn
将值转发给主线程:
self.viewModel.loginStatus
.producer
.observeOn(UIScheduler())
.startWithNext { status in
self.setLoginButtonStatus(status)
)