Работя върху частта за вход в приложението си и мислех да използвам 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
е просто енум.
И това е според мен модела „s 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
? Това всъщност забавя повторното активиране на бутона ми.
Аз се обърквам с примерите в мрежата, тъй като повечето от тях са в Objective-C и мисля, че някои имена на функции са променени и т.н. ...
Благодаря много!
Отговори:
1 за отговор № 1Други могат да говорят за MVVM подход, който приемате, но по отношение на предупреждението, което виждате: това е, защото използвате UIKit от фонова нишка. Представям си, че това идва от self.setLoginButtonStatus
обадете се. В зависимост от това, което сигнализира за вашето обвързване с това свойство, е възможно (и това се случва в този случай) стойностите, излъчвани от неговия производител не се излъчват върху основната нишка.
За да поправите това, можете да използвате observeOn
, за да препратите стойности към основната нишка:
self.viewModel.loginStatus
.producer
.observeOn(UIScheduler())
.startWithNext { status in
self.setLoginButtonStatus(status)
)