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,需要将属性用@objc
和dynamic
修饰。如下:
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
}()
}
网友评论