Rx 键值观察KVO的使用

  • 键值观察KVO的使用 1,KVO 介绍 KVO(键值观察)是一种 Objective-C 的回调机制,全称为:key-value-observing。 该机制简单来说就是在某个对象注册监听者后,当被监听的对象发生改变时,对象会发送一个通知给监听者,以便监听者执行回调操作。

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

(1)性能比较 rx.observe 更加高效,因为它是一个 KVO 机制的简单封装。 rx.observeWeakly 执行效率要低一些,因为它要处理对象的释放防止弱引用(对象的 dealloc 关系)。

(2)使用场景比较 在可以使用 rx.observe 的地方都可以使用 rx.observeWeakly。 使用 rx.observe 时路径只能包括 strong 属性,否则就会有系统崩溃的风险。而 rx.observeWeakly 可以用在 weak 属性上。

二、使用样例 1,监听基本类型的属性 (1)我们创建一个定时器,每隔 1 秒钟给变量 message 尾部添加一个感叹号(!)。同时对这个属性进行监听,当值改变时将最新值输出到控制台中。 注意: 监听的属性需要有 dynamic 修饰符。 本样例需要使用 rx.observeWeakly,不能用 rx.observe,否则会造成循环引用,引起内存泄露。

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)运行结果如下: 原文:Swift - RxSwift的使用详解64(键值观察KVO的使用)

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)程序启动后默认是竖屏状态,接着我们将其变成横屏显示。控制台输出内容如下: 原文:Swift - RxSwift的使用详解64(键值观察KVO的使用)

3,渐变导航栏效果 (1)效果图如下,导航栏会随着 tableView 的滑动而发生不同的变化: 默认情况下,导航栏背景是完全透明的。 当 tableView 向上滑动时,导航栏背景逐渐显示出来。 当 tableView 下载滑动时,导航栏背景又逐渐消失。 原文:Swift - RxSwift的使用详解64(键值观察KVO的使用) 原文:Swift - RxSwift的使用详解64(键值观察KVO的使用) 原文:Swift - RxSwift的使用详解64(键值观察KVO的使用)

(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)
            })
    }
}

原文地址:https://www.cnblogs.com/liuxiaokun/p/12683822.html

时间: 2024-11-08 22:32:59

Rx 键值观察KVO的使用的相关文章

obj-c编程17:键值观察(KVO)

说完了前面一篇KVC,不能不说说它的应用KVO(Key-Value Observing)喽.KVO类似于ruby里的hook功能,就是当一个对象属性发生变化时,观察者可以跟踪变化,进而观察或是修正这个变化,这是通过回调观察者注册的回调函数来完成的.要使用键值观察,必须满足3个条件: 1 被观察对象必须对所观察属性使用符合KVC标准的存取器方法: 2 观察者必须实现接受通知的方法(回调方法):-observeValue:forKeyPath:ofObject:change:context:,该方法

键值观察 KVO

Key-Value Observing Programming Guide 1,注册Key-Value Observing: 要实现这个目的,需要: 1)被观察的类对你想要观察的属性必须是服从Key-Value observing的 2)你必须注册被观察对象的观察对象,使用addObserver:forKeyPath:options:context:. 3)观察者类必须实现observeValueForKeyPath:ofObject:change:context: 重要提示:不是所有的类对所有

KVO键值观察简述

KVO 键值观察,简单来说就是为一个key添加一个观察者,当key的值发生改变的时候会发送通知,在接到通知的时候会有回调方法被调用 #import "ViewController.h" @interface ViewController (){     NSMutableDictionary * myDict; } @end @implementation ViewController - (IBAction)dasdas:(id)sender {          //改变key的值

[深入浅出Cocoa]详解键值观察(KVO)及其实现机理

一,前言 Objective-C 中的键(key)-值(value)观察(KVO)并不是什么新鲜事物,它来源于设计模式中的观察者模式,其基本思想就是: 一个目标对象管理所有依赖于它的观察者对象,并在它自身的状态改变时主动通知观察者对象.这个主动通知通常是通过调用各观察者对象所提供的接口方法来实现的.观察者模式较完美地将目标对象与观察者对象解耦. 在 Objective-C 中有两种使用键值观察的方式:手动或自动,此外还支持注册依赖键(即一个键依赖于其他键,其他键的变化也会作用到该键).下面将一一

KVO(键-值观察)

// 1.键-值观察 // 2.它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知. // 3.符合KVC(Key-ValuedCoding)机制的对象才可以使用KVO // 4.实现过程 // ①注册,指定被观察者 // ②实现回调方法 // ③移除观察 - (void)viewDidLoad {     [super viewDidLoad];     // Do any additional setup after loading the view from its nib.

K-V-C 键值观察机制

在两个不同的控制器之间传值是iOS开发中常有的情况,应对这种情况呢,有多种的应对办法.kvc就是其中的一种,所以,我们就在此解释之.   key value observing  键值观察,给人一种高冷的感觉,其实,我们可以用一个通俗的例子来解释之.就拿美俄之间的间谍来举例子.美俄是两个各自独立的国家,但是为了各自的利益,彼此之间勾心斗角,不断的爆出间谍丑闻.打住!从政治的深渊回到技术层面O(∩_∩)O.美国想知道俄罗斯的最新的导弹技术,于是派间谍收集情报,(kvo的第一步:注册观察者-美国,监

深度理解Key-Value Observing 键值观察

前言   在上一阶段的开发过程中,我们大量使用了 KVO 机制,来确保页面信息的及时同步.也因此碰到了很多问题,促使我们去进一步学习 KVO 的相关机制,再到寻找更好的解决方案.鉴于 KVO 让人欲仙欲死的使用经历,在这里做一个简单分享.此分享的目的,更多的是在于点出 KVO 相关的技术点,供我们大家在学习和使用过程中做一个参考. 对于 KVO 的背后机制感兴趣的同学,可以直接看第三部分,KVC 和 isa-swizzling . 对于 替代方案感兴趣的同学,请直接跳到末尾的第五部分,有列出了目

iOS 键值观察(KVO)简述及实例理解

KVO概述: KVO,即:Key-Value Observing,直译为:基于键值的观察者.  它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知. 简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了.KVO的优点: 当有属性改变,KVO会提供自动的消息通知.这样开发人员不需要自己去实现这样的方案:每次属性改变了就发送消息通知. 这是KVO机制提供的最大的优点.因为这个方案已经被明确定义,获得框架级支持,可以方便地采用. 开发人员不需要添加任何代码,

键-值观察

若想成为一个键的观察者,可添加如下代码. [theAppDelegate addObserver:self forKeyPath:@"fido" options:NSKeyValueObservingOptionOld context:nil]; 上述方法定义在NSObject中,实际上类似于说,“无论何时fido改变了就给我发个消息”,options和context决定fido改变时将哪些额外的数据与消息一起发送出去.触发方法过程如下 -(void)observeValueForKe