RxDataSources与TableView中实现界面展示(二)

通过按钮刷新界面参数,设置延时为2s


//  ViewController.swift
//  RxSwiftTest
//
//  Created by travey on 2018/11/5.
//  Copyright © 2018年 ZhouShijie. All rights reserved.


import UIKit
import RxSwift
import RxCocoa
import SnapKit
import RxDataSources

    class ViewController: UIViewController {

        let disposeBag = DisposeBag()
        var tableView: UITableView!
        var refreshbtn: UIButton! // 创建一个刷新按钮

        // 通过刷新按钮的流,产生随机数
        // 自定义函数,返回的类型是一个Observable,这个Observable是一个数组,每个数组装的元素类型是一个SectionModel类型,SectionModel类型里面有两个变量,一个是标题,一个是下面的cell,cell用一个数组展示,并且要求标题是String类型的,cell里面元素的类型是Int类型的
        func getRandomResult() -> Observable<[SectionModel<String, Int>]> {
            print("正在请求数据......")
            let items = Array(repeating: 0, count: 10).map{ _ in
                Int(arc4random())
            }
            let observable = Observable.just([SectionModel(model: "Zhou", items: items)])
            return observable.delay(2, scheduler: MainScheduler.instance)
        }


        override func viewDidLoad() {

            // UI设置
            tableView = UITableView(frame: CGRect(x: 0, y: 200, width: view.bounds.width, height: view.bounds.height - 200), style: .plain)
            tableView!.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
            refreshbtn = UIButton()
            refreshbtn.setTitle("刷新", for: .normal)
            refreshbtn.setTitleColor(UIColor.black, for: .normal)
            refreshbtn.frame = CGRect(x: 0, y: 0, width: view.bounds.width / 3, height: 50)
            refreshbtn.center = CGPoint(x: view.bounds.width / 2, y: 100)
            refreshbtn.layer.borderWidth = 1
            view.addSubview(refreshbtn)
            view.addSubview(tableView)

            // 通过刷新按钮,产生随机流,保存到randomResult变量中
            let randomResult = refreshbtn.rx.tap.asObservable()
                .throttle(1, scheduler: MainScheduler.instance) // 如果一秒内点击多次,取最后一次
                .startWith(()) // 确保一开始的时候就有值
                .flatMapLatest(getRandomResult) // 通过自定义函数转化成随机数
                .share(replay: 1) // 确保只发送一次

            // 创造数据源,数据源的类型是SectionModel<String, Int>类型
            let dataSource = RxTableViewSectionedReloadDataSource
            <SectionModel<String, Int>>(
            configureCell: {
                ds, tv, indexPath, element in
                let cell = tv.dequeueReusableCell(withIdentifier: "cell")
                cell?.textLabel?.text = "现在的索引是\(indexPath.row),内容为\(element)"
                return cell!
            }
            )

            // 绑定
            randomResult.bind(to: tableView.rx.items(dataSource: dataSource)).disposed(by: disposeBag)
        }
    }


 

加上一个停止按钮,按了以后就不更新了


//  ViewController.swift
//  RxSwiftTest
//
//  Created by travey on 2018/11/5.
//  Copyright © 2018年 ZhouShijie. All rights reserved.


import UIKit
import RxSwift
import RxCocoa
import SnapKit
import RxDataSources

    class ViewController: UIViewController {

        let disposeBag = DisposeBag()
        var tableView: UITableView!
        var refreshbtn: UIButton! // 创建一个刷新按钮
        var stopbtn:UIButton!

        // 通过刷新按钮的流,产生随机数
        // 自定义函数,返回的类型是一个Observable,这个Observable是一个数组,每个数组装的元素类型是一个SectionModel类型,SectionModel类型里面有两个变量,一个是标题,一个是下面的cell,cell用一个数组展示,并且要求标题是String类型的,cell里面元素的类型是Int类型的
        func getRandomResult() -> Observable<[SectionModel<String, Int>]> {
            print("正在请求数据......")
            let items = Array(repeating: 0, count: 10).map{ _ in
                Int(arc4random())
            }
            let observable = Observable.just([SectionModel(model: "Zhou", items: items)])
            return observable.delay(2, scheduler: MainScheduler.instance)
        }


        override func viewDidLoad() {

            // UI设置
            tableView = UITableView(frame: CGRect(x: 0, y: 200, width: view.bounds.width, height: view.bounds.height - 200), style: .plain)
            tableView!.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
            
            refreshbtn = UIButton()
            refreshbtn.setTitle("刷新", for: .normal)
            refreshbtn.setTitleColor(UIColor.black, for: .normal)
            refreshbtn.frame = CGRect(x: 0, y: 0, width: view.bounds.width / 3, height: 50)
            refreshbtn.center = CGPoint(x: view.bounds.width / 2, y: 100)
            refreshbtn.layer.borderWidth = 1
            view.addSubview(refreshbtn)
            view.addSubview(tableView)
            
            stopbtn = UIButton()
            stopbtn.setTitle("停止", for: .normal)
            stopbtn.setTitleColor(UIColor.black, for: .normal)
            stopbtn.frame = CGRect(x: 0, y: 0, width: view.bounds.width / 3, height: 50)
            stopbtn.center = CGPoint(x: view.bounds.width / 2, y: 160)
            stopbtn.layer.borderWidth = 1
            view.addSubview(stopbtn)
            

            // 通过刷新按钮,产生随机流,保存到randomResult变量中
            let randomResult = refreshbtn.rx.tap.asObservable()
                .throttle(1, scheduler: MainScheduler.instance) // 如果一秒内点击多次,取最后一次
                .startWith(()) // 确保一开始的时候就有值
                .flatMapLatest(getRandomResult) // 通过自定义函数转化成随机数
                .takeUntil(stopbtn.rx.tap) // 如果我按了停止,就停止更新
                .share(replay: 1) // 确保只发送一次

            // 创造数据源,数据源的类型是SectionModel<String, Int>类型
            let dataSource = RxTableViewSectionedReloadDataSource
            <SectionModel<String, Int>>(
            configureCell: {
                ds, tv, indexPath, element in
                let cell = tv.dequeueReusableCell(withIdentifier: "cell")
                cell?.textLabel?.text = "现在的索引是\(indexPath.row),内容为\(element)"
                return cell!
            }
            )

            // 绑定
            randomResult.bind(to: tableView.rx.items(dataSource: dataSource)).disposed(by: disposeBag)
        }
    }


猜你喜欢

转载自blog.csdn.net/shijie97/article/details/83793527