RxSwift学习iOS--三方技术iOS开发大神总结

Swift - RxSwift的使用详解64(键值观察KVO的使

2018-05-29  本文已影响208人  八级大狂风AM

一、基本介绍

1,KVO 介绍

2,RxSwift 中的 KVO

RxCocoa 提供了 2 个可观察序列 rx.observerx.observeWeakly,它们都是对 KVO 机制的封装,二者的区别如下。

(1)性能比较

(2)使用场景比较

二、使用样例

1,监听基本类型的属性

(1)我们创建一个定时器,每隔 1 秒钟给变量 message 尾部添加一个感叹号(!)。同时对这个属性进行监听,当值改变时将最新值输出到控制台中。

注意:

import UIKit
import RxSwift
import RxCocoa
 
class ViewController: UIViewController {
     
    let disposeBag = DisposeBag()
     
    @objc dynamic var message = "hangge.com"
     
    override func viewDidLoad() {
        super.viewDidLoad()
       
        //定时器(1秒执行一次)
        Observable<Int>.interval(1, scheduler: MainScheduler.instance)
            .subscribe(onNext: { [unowned self] _ in
                //每次给字符串尾部添加一个感叹号
                self.message.append("!")
            }).disposed(by: disposeBag)
         
        //监听message变量的变化
        _ = self.rx.observeWeakly(String.self, "message")
            .subscribe(onNext: { (value) in
            print(value ?? "")
        })
    }
}

2,监听视图尺寸变化

(1)我们对 view.frame 进行监听,当其改变时将最新值输出到控制台中。

注意:这里必须使用 rx.observe,如果使用 rx.observeWeakly 则监听不到。

import UIKit
import RxSwift
import RxCocoa
 
class ViewController: UIViewController {
     
    override func viewDidLoad() {
        super.viewDidLoad()
         
        //监听视图frame的变化
        _ = self.rx.observe(CGRect.self, "view.frame")
            .subscribe(onNext: { frame in
                print("--- 视图尺寸发生变化 ---")
                print(frame!)
                print("\n")
            })
    }
}

(2)程序启动后默认是竖屏状态,接着我们将其变成横屏显示。控制台输出内容如下:

3,渐变导航栏效果

(1)效果图如下,导航栏会随着 tableView 的滑动而发生不同的变化:

(2)我们可以通过KVO 监听偏移量的变化来动态改变导航栏的背景透明度,这个我在之前的文章中也介绍过(点击查看)。如果在 RxSwift 项目中的话,KVO 使用起来会简单许多。

import UIKit
import RxSwift
import RxCocoa
 
class ViewController: UIViewController {
     
    var tableView:UITableView!
     
    ////导航栏背景视图
    var barImageView:UIView?
     
    let disposeBag = DisposeBag()
     
    override func viewDidLoad() {
        super.viewDidLoad()
         
        //导航栏背景色为橙色
        self.navigationController?.navigationBar.barTintColor = .orange
         
        //获取导航栏背景视图
        self.barImageView = self.navigationController?.navigationBar.subviews.first
         
        //创建表格视图
        self.tableView = UITableView(frame: self.view.frame, style:.plain)
        //创建一个重用的单元格
        self.tableView!.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")
        self.view.addSubview(self.tableView!)
         
        //初始化数据
        let items = Observable.just(Array(0...100).map{ "这个是条目\($0)"})
         
        //设置单元格数据(其实就是对 cellForRowAt 的封装)
        items.bind(to: tableView.rx.items) { (tableView, row, element) in
            let cell = tableView.dequeueReusableCell(withIdentifier: "Cell")!
            cell.textLabel?.text = "\(element)"
            return cell
        }
        .disposed(by: disposeBag)
         
        //使用kvo来监听视图偏移量变化
        _ = self.tableView.rx.observe(CGPoint.self, "contentOffset")
            .subscribe(onNext: {[weak self] offset in
                var delta = offset!.y / CGFloat(64) + 1
                delta = CGFloat.maximum(delta, 0)
                self?.barImageView?.alpha = CGFloat.minimum(delta, 1)
            })
    }
}

RxSwift使用详解系列
原文出自:www.hangge.com转载请保留原文链接

上一篇 下一篇

猜你喜欢

热点阅读