Swift学习:KVO和单例

KVO

KVO(Key-value observing)是cocoa编程模式中的一种通知机制,其主要用来观察一个对象属性变化。KVO在变化分层设计中是最常用,比如说MVC中的model和views之间通信。

Objective-C

KVO在Objective-C中的使用时需要三个步骤,首先

1. Register

- (void)addObserver:(NSObject *)observer 
         forKeyPath:(NSString *)keyPath 
            options:(NSKeyValueObservingOptions)options 
            context:(void *)context;

2. ObserverValueChange

- (void)observeValueForKeyPath:(NSString *)keyPath 
                      ofObject:(id)object 
                        change:(NSDictionary<NSKeyValueChangeKey, id> *)change 
                       context:(void *)context;

3. RemoveObserver

- (void)removeObserver:(NSObject *)observer 
            forKeyPath:(NSString *)keyPath;

Swift

在swift中,如果想类的属性支持KVO,需要将属性用@objcdynamic修饰。如下:

class MyObjectToObserve: NSObject {
    @objc dynamic var age = 24 
    func updateAge() {
        age += 1
    }
}

区别于Objective-C中的register、valueChange、remove等方法实现在不同的位置。swift的KVO实现在方法observe(_:options:changeHandler:)执行以上操作。

class MyObserver: NSObject {
    @objc var objectToObserve: MyObjectToObserve
    var observation: NSKeyValueObservation?
    
    init(object: MyObjectToObserve) {
        objectToObserve = object
        super.init()
        
        observation = observe(\.objectToObserve.age,
                              options: [.old, .new],
                              changeHandler: { (object, change) in
            print("去年年龄: \(change.oldValue!), 今年年龄: \(change.newValue!)")
        })
    }
}

初始化需要观察的对象:

let observerd = MyObjectToObserve()
let observer = MyObserver(object: observed)

observed.updateAge() // 触发属性值的变化
// 去年年龄: 24, 今年年龄: 25

可以看到,swift下使用KVO,不用主动调用removObserver方法,从而降低了Objective-C中忘记调用而导致的crash,并且keypath和是一一对应的。

Singleton

单例也是UI开发中分常用的设计模式。swift中单例区别于Objective-C中的实现,使用static关键字修饰属性。

class Singleton {
  static let sharedInstance = Singleton()
}

如果需要在初始化类之前初始一些边来个,需要采用下面的方法:

class Singleton {
  static let sharedInstance: Singleton {
    let instance = Singleton()
    // 初始化代码
    return instance
  }()
}

参考文章

  1. Using Key-Value Observing in Swift
  2. Managing a Shared Resource Using a Singleton
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。