美文网首页程序员
Swift学习:KVO和单例

Swift学习:KVO和单例

作者: Think_cy | 来源:发表于2020-07-19 15:56 被阅读0次

    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

    相关文章

      网友评论

        本文标题:Swift学习:KVO和单例

        本文链接:https://www.haomeiwen.com/subject/vjfrkktx.html