在Swift(2)中使用UITableView-与RxSwift

正如我们在上一篇文章中介绍了UITableView的基本用法之后,这次我们将将该示例转换为一个使用RxSwift处理UITableView

RxSwift是一个更高级的主题。 请注意,这个故事仅演示了基础知识,但是可以肯定的是,如果广泛且正确地使用它,它可以将您和您的应用程序提升到另一个层次。 本教程的源代码可在Github上获得。


我们将从创建另一个安装了CocoapodsRxSwift Xcode项目开始。

  $ pod init 

RxSwift添加到Podfile

  ...#UITableView吊舱“ RxSwift”的吊舱 
豆荚“ RxCocoa”
...

安装pod并打开UITableView.xcworkspace

  $ pod安装 

初始设置

首先通过在UIViewController导入RxSwiftRxCocoa ,然后我们可以将代码转换为Rx样式。

 导入RxSwift 
进口RxCocoa

这次,我们还需要在UITableView通过以下JSON显示数据。

  // travel.json 
[
{
“名称”:“香港”,
“ desc”:“我住的地方。”,
“ url”:“
https://zh.wikipedia.org/wiki/香港
},
{
“名称”:“新加坡”,
“ desc”:“一个干净整洁的地方。”,
“ url”:“
https://zh.wikipedia.org/wiki/新加坡”
},
{
“ name”:“ Japan”,
“ desc”:“喜欢那些美味的寿司和生鱼片。”,
“ url”:“
https://zh.wikipedia.org/wiki/日本”
}
]

它是在这里https://api.myjson.com/bins/16w6h0作为API生成的。 然后,我们的模型如下。

 结构位置:可分解{ 
命名:字符串
let desc:字符串
让网址:字符串
}

转换代码

无需声明Place数组,而是其声明为BehaviorRelay作为可以订阅的Observable ,即,当更新此Place时 ,将发出某种事件来捕获它。

 让disposeBag = DisposeBag() 
让地方:BehaviorRelay = BehaviorRelay(值:[])

当我们实现提取数据方法时, BehaviorRelay的值将相应地更新。

  func fetchData(){ 
如果让url = URL(string:“ https://api.myjson.com/bins/16w6h0”){
URLSession.shared.dataTask(with:url){数据,响应,错误
如果让数据=数据{
做{
让地方=尝试JSONDecoder()。decode([地方] .self,来自:数据)
self.places.accept(places)
}捕获让错误{
打印(错误)
}
}
}。恢复()
}
}

我们可以先前丢弃UITableViewDataSource的方法,并将BehaviorRelay绑定到UITableView以获得相同的结果。

  place.bind(to:tableView.rx.items(cellIdentifier:“ cell”)){行,模型,单元格在 
cell.textLabel?.text =“ \(model.name),\(model.desc)”
} .disposed(作者:disposeBag)

所以我们做到了! 用RxSwift方式RxSwift UITableView东西。 实际上,我们可以如下处理表格单元格单击事件以轻松打开Web视图。

  tableView.rx.modelSelected(Place.self) 
.map {URL(string:$ 0.url)}
.subscribe(onNext:{[弱自我]网址
警卫让url = url else {
返回
}
self?.present(SFSafariViewController(url:url),动画:true)
} .disposed(作者:disposeBag)

这是UITableViewRxSwift演示的结尾。

本教程的源代码可在Github上找到,希望您会发现它有用:)。

干杯!