swift – 如何在ReactiveCocoa 3和4中进行基本绑定
我最近一直在阅读Reactive
Cocoa v3,我正在努力只是设置基本的东西.我已经阅读了更新日志,测试,几个问题和Colin Eberhardt关于这个问题的文章.但是,我仍然缺少基本绑定的例子.
假设我有一个应用程序显示当天的菜单.该应用程序正在使用RAC3和MVVM模式. 模型(菜单) 该模型有一个简单的方法来获取今天的菜单.至于现在,这不要做任何网络请求,它基本上只是创建一个模型对象. mainCourse属性是一个String. class func fetchTodaysMenu() -> SignalProducer<Menu,NoError> { return SignalProducer { sink,dispoable in let newMenu = Menu() newMenu.mainCourse = "Some meat" sendNext(sink,newMenu) sendCompleted(sink) } } ViewModel(MenuViewModel) 视图模型暴露了不同的String变量,让视图控制器显示菜单.我们只需添加一个显示主菜单的属性. var mainCourse = MutableProperty("") 我们为此属性添加绑定: self.mainCourse <~ Menu.fetchTodaysMenu() |> map { menu in return menu.mainCourse! } ViewController(MenuViewController) 最后但并非最不重要的是,我想提出这个主要课程.我会为此添加一个UILabel. var headline = UILabel() 最后我想通过观察我的视图模型来设置该UILabel的text属性.就像是: self.headline.text <~ viewModel.headline.producer 不幸的是不行. 问题 > fetchTodaysMenu()方法返回一个SignalProducer< Menu,NoError>,但是如果我想要这种方法返回SignalProducer< Menu,NSError>代替?这将使我的视图模型中的绑定失败,因为该方法现在可能会返回一个错误.我该如何处理? 任何其他反馈/指导如何使这个基本设置受到高度赞赏.
所以,在写这个问题之后,Colin Eberhardt做了他的RAC3博客文章系列的第3部分,其中包括一个使用MVVM和RAC3的有趣且非常相关的例子.该帖子可以发现
here和源代码
here.
根据他的工作,我设法回答了我自己的问题: >通过略微不同的方法,我可以使fetchTodaysMenu()返回一个SignalProducer< Menu,NSError>按需要以下是我在视图模型中做的事情: MenuService.fetchTodaysMenu() |> observeOn(QueueScheduler.mainQueueScheduler) |> start(next: { response in self.mainCourse.put(response.mainCourse!) },error: { println("Error ($0)") }) >似乎没有UIKit绑定,而是RAC3 beta 4. Colin自己做了一些UIKit扩展来帮助他做这些绑定我也在寻找.这些可以在here找到.将它们添加到我的项目中,使得能够完全按照我想要的: self.mainCourse.rac_text <~ self.viewModel.mainCourse 更新2015年5月25日 在ReactiveCocoa 3工作之后,我再次回答1).通过使用catch,可以以更加声明的方式来做到这一点.我最终实现了一个小帮手功能: public func ignoreError<T: Any,E: ErrorType>(signalProducer: SignalProducer<T,E>) -> SignalProducer<T,NoError> { return signalProducer |> catch { _ in SignalProducer<T,NoError>.empty } } 该函数将任何NSError转换为NoError,使得可以按照我想要的方式进行绑定:MenuService.fetchTodaysMenu()|> ignoreError. 我开始采购我的项目,因为这可能是其他人研究ReactiveCocoa 3.0的好起点: 2016年3月5日更新 正如注释中所强调的,自Swift 2以来,ignoreError函数现在将如下所示: public func ignoreError() -> SignalProducer<Value,NoError> { return flatMapError { _ in SignalProducer<Value,NoError>.empty } } 此外,还建立了一个名为Rex的扩展库,其中添加了类似的内容. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |