俄罗斯贵宾会-俄罗斯贵宾会官网
做最好的网站

RxSwift学习笔记1:RxSwift的编程风格

第一天:简单体验与RxSwift的编程风格

RxSwift扫盲

作为iOS开发者,或许你没听说过RxSwift,但是一定听说过函数式编程[Functional Programming]、响应式编程[Reactive Programming]、函数响应式编程[Functional Reactive Programming];

import UIKit
//导入Rx相关框架
import RxSwift
import RxCocoa

struct Music {
    let name:String
    let singer:String

    init(name:String,singer:String) {
        self.name = name
        self.singer = singer
    }
}

extension Music:CustomStringConvertible{
    var description: String {
        return "name:(name) singer:(singer)"
    }
}


struct MusicListModel {
    /*
     这里我们将 data 属性变成一个可观察序列对象(Observable Squence),
     而对象当中的内容和我们之前在数组当中所包含的内容是完全一样的。
     关于可观察序列对象在后面的文章中我会详细介绍。
     简单说就是“序列”可以对这些数值进行“订阅(Subscribe)”,有点类似于“通知(NotificationCenter)”
     */
    let data = Observable.just([
        Music(name: "无条件", singer: "陈奕迅"),
        Music(name: "你曾是少年", singer: "S.H.E"),
        Music(name: "从前的我", singer: "陈洁仪"),
        Music(name: "在木星", singer: "朴树")
        ])
}

/*
 这里我们不再需要实现数据源和委托协议了。而是写一些响应式代码,让它们将数据和 UITableView 建立绑定关系。
 */

class ViewController: UIViewController {
    @IBOutlet weak var tableView: UITableView!
    /*
     DisposeBag:作用是 Rx 在视图控制器或者其持有者将要销毁的时候,自动释法掉绑定在它上面的资源。
     它是通过类似“订阅处置机制”方式实现(类似于 NotificationCenter 的 removeObserver)。
     */
    let disposeBag = DisposeBag()
    let musicArray = MusicListModel()


    override func viewDidLoad() {
        super.viewDidLoad()

        //将数据源数据绑定到tableView上
        /*
         rx.items(cellIdentifier:):这是 Rx 基于 cellForRowAt 数据源方法的一个封装。
         传统方式中我们还要有个 numberOfRowsInSection 方法,使用 Rx 后就不再需要了(Rx 已经帮我们完成了相关工作)。
         */
        musicArray.data.bind(to: tableView.rx.items(cellIdentifier:"musicCell")) { _, music, cell in
            cell.textLabel?.text = music.name
            cell.detailTextLabel?.text = music.singer
            }.disposed(by: disposeBag)

        //tableView点击响应
        /*
         rx.modelSelected: 这是 Rx 基于 UITableView 委托回调方法 didSelectRowAt 的一个封装。
         */
        tableView.rx.modelSelected(Music.self).subscribe(onNext: { music in
            print("你选中的歌曲信息【(music)】")
        }).disposed(by: disposeBag)

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}
见名知意,RxSwift 是在 Apple 推出 Swift 后,针对 Swift 语言 ReactiveX 推出 Reactive Extensions 系列一个实现库;除此之外,ReactiveX 还推出了 RxJava,RxAndroid,RxPHP 等蕴含类似思想的框架。

由代码可以看出,与官方通过MVC代理方式实现列表的数据展示和操作,RxSwift在代码上跟精简,逻辑上更加连贯。

为什么要学习RxSwift?

我们知道 C 语言的面向过程,Objective-C、C++ 面向对象编程, Java 的 Spring 框架提出了面向切面编程的思想,学习 RxSwift 不是学习如何使用第三方库,而是学习一种编程思想--函数响应式编程;

本文由俄罗斯贵宾会发布于编程,转载请注明出处:RxSwift学习笔记1:RxSwift的编程风格

您可能还会对下面的文章感兴趣: