文档章节

Swift中KVO(监听)的使用方法及注意事项

S
 SimonXun
发布于 2016/05/20 16:11
字数 402
阅读 111
收藏 2

   1,在写swift的KVO的过程中,其不能监听基本数据类型的属性,若想监听需将其改成NSNumber类型,或其它类型,否则监听的代理方法不走。

   2,在写swift的KVO的过程中,被监听的属性必须用“dynamic”修饰,否则监听的代理方法不走。

   3,在写swift的KVO的过程中,要保证监听者和被监听者同时存在(考虑到其生命周期)。

   4,在写swift的KVO的过程中,要确保最后移除观察者,防止内存泄露。

class MyObjectToObserve: NSObject {
    dynamic var myDate = NSDate()
    func updateDate() {
        myDate = NSDate()
    }
}

private var myContext = 0

class MyObserver: NSObject {
    var objectToObserve = MyObjectToObserve()
    override init() {
        super.init()
        objectToObserve.addObserver(self, forKeyPath: "myDate", options: .New, context: &myContext)
    }

    override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [NSObject : AnyObject]?, context: UnsafeMutablePointer<Void>) {
        if context == &myContext {
            if let newValue = change?[NSKeyValueChangeNewKey] {
                print("Date changed: \(newValue)")
            }
        } else {
            super.observeValueForKeyPath(keyPath, ofObject: object, change: change, context: context)
        }
    }

    deinit {
        objectToObserve.removeObserver(self, forKeyPath: "myDate", context: &myContext)
    }
}

 

属性观察器

Swift 中可以为一个属性设置属性观察器,可以说是内建的 KVO 观察,只不过只限于对自身属性的观察。看起来像这个样子:

class StepCounter {
    var totalSteps: Int = 0 {
        willSet(newTotalSteps) {
            print("About to set totalSteps to \(newTotalSteps)")
        }
        didSet {
            if totalSteps > oldValue  {
                print("Added \(totalSteps - oldValue) steps")
            }
        }
    }
}

属性观察器只在在初始化完成后触发,而且不限于 NSObject 的子类,Swift 中所有的 Class, Struct, Enum 都可以使用。
Swift 内建的Array, Dictionary, Set 等都是值类型,对其内容的修改包括添加,删除,替换元素也会触发属性观察器。

© 著作权归作者所有

共有 人打赏支持
S
粉丝 5
博文 63
码字总数 52427
作品 0
深圳
程序员
swift中KVO和属性观察器

开篇提醒:OC中的KVO及其KVO的基础知识可参见:深入runtime探究KVO Swift中,原本没有KVO模式,为何这么说,请看下文: KVO本质上是基于的动态分发机制,通过来监听的值。 OC能够实现监听因为...

CoderDancer
2017/01/13
0
0
设计模式(Swift) - 3.观察者模式、建造者模式

上一篇 设计模式(Swift) - 2.单例模式、备忘录模式和策略模式中讲了三种常见的设计模式. 单例模式: 限制了类的实例化,一个类只能实例化一个对象,所有对单例对象的引用都是指向了同一个对象....

Dariel
07/01
0
0
KVO的简单认识

KVO 概念 KVO - key value observer 观察 的一种手段,可以用在开源框架,让代码解耦。例如: 常见面试题 KVO 是同步的还是异步的? 代码演练 添加观察 // 添加键值观察/** 1. 调用对象:要监...

就不穿小内
2015/12/26
35
0
dynamic动态分发,unsafeBitCast,自动调用的闭包-设置时,会设置一个KVO监听

//MARK: - 主题更改时,自动执行 extension NSObject { fileprivate struct AssociatedKeys { static var thmemChanged = "thmemChanged" } /// 当前主题更改时、第一次设置时 自动调用的闭包...

iOS技术者
2017/05/01
0
0
【卡片记忆】ios常见的名称

一句话描述消息机制 非正式协议 正式协议 stack (栈)对象的创建 只要栈的剩余空间大于stack 对象申请创建的空间,操作系统就会为程序提供这段内存空间,否则将报异常提示栈溢出。 heap (堆)...

创意总监
2016/03/18
22
0

没有更多内容

加载失败,请刷新页面

加载更多

wordpress 汉化

在 wp-config.php 添加 define('WPLANG','zh_CN'); 在后台,更新 now ,即可。

james_laughing
7分钟前
0
0
Android JNI开发系列(十一) JNI 访问父类的构造方法和父类实例方法

JNI 访问父类的构造方法和父类实例方法 构造方法和父类实例方法 先看一段Java代码, Java package org.professor.jni.animal;import android.util.Log;public class Animal {protecte...

蔡小鹏
13分钟前
0
0
腾讯投资最高1.75亿美元正式进军菲律宾移动支付市场

菲律宾长途电话公司(PLDT)公司今日宣布,中国互联网巨头腾讯和私募股权公司KKR将获得该公司旗下金融科技公司Voyager Innovations的少数股权。 PLDT在一份声明中称:“腾讯和KKR最多将分别收...

linuxCool
40分钟前
2
0
正则介绍及grep/egrep用法

10月16日任务 9.1 正则介绍_grep上 9.2 grep中 9.3 grep下 扩展 把一个目录下,过滤所有*.php文档中含有eval的行 grep -r --include="*.php" 'eval' /data 正则介绍 正则就是一串有规律的字符...

hhpuppy
51分钟前
1
0
J2Cache 中使用 Lettuce 替代 Jedis 管理 Redis 连接

一直以来 J2Cache 都是使用 Jedis 连接 Redis 服务的。Jedis 是一个很老牌的 Redis 的 Java 开发包,使用很稳定,作者维护很勤勉,社区上能搜到的文章也非常非常多。算是使用范围最广的 Redi...

红薯
今天
15
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部