使用HTTP请求的ReactiveCocoa 4 MVVM最佳实践

时间:2015-12-02 06:52:02

标签: swift mvvm swift2 ios9 reactive-cocoa

我正在处理我的应用程序的登录部分,我想过使用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中,我认为某些函数名称已更改,等等...

非常感谢!

1 个答案:

答案 0 :(得分:1)

其他人可以谈论您正在采取的 MVVM 方法,但关于您所看到的警告:那是因为您正在使用来自后台线程的UIKit 。我想这来自self.setLoginButtonStatus电话。根据您对该属性的绑定的信号,它可能(并且在这种情况下发生)它的生成器发出的值不会在主线程上发出。< / p>

要解决此问题,您可以使用observeOn将值转发给主线程:

self.viewModel.loginStatus
    .producer
    .observeOn(UIScheduler())
    .startWithNext { status in
          self.setLoginButtonStatus(status)
    )