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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Swift中KVO(监听)的使用方法及注意事项相关的知识,希望对你有一定的参考价值。

---恢复内容开始---

     相信研究swift语言的开发者都多多少少了解或者精通Objective—C语言,熟练掌握Objective—C语言的开发者,在学习swift语言的过程中,是比较快速,而又轻松的。本人就是一位熟练掌握OC语言,后开始研究的swift。在学习swift语言的过程中,笔者建议有OC基础的开发者,在写swift的代码过程中,再写一下OC中的代码,二者相互比较,相信你能找到快速学会swift语言的方法。资深,有耐心和有天赋的开发者,相信能在一周左右,能够运用swift开发项目。其中消耗的时间,也只是个别地方的学习,了解并注意。

   我这次写的是swift中的监听即KVO的用法,一开始我是先写成OC的代码,然后转化成swift的代码的。在转化过程中发现一些问题,费了一定时间去研究,去思考,去找资料。一下是swift中KVO中所需要注意的问题(仅个人测试所总结的,代码有不对之处望指正,期望共同交流)。

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

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

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

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

 

以下是代码部分

 ViewController.swift页面

//
//  ViewController.swift
//  swift监听的用法
//
//  Created by mac on 16/2/6.
//  Copyright © 2016年 ZY. All rights reserved.
//

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var btn: UIButton!
    var _view1:NewView!;
    var myObject:MyNSObject!;
    var age:Int!;
    //myContext的作用,主要是区分监听对象,具体作用,科自己上网查阅资料
    private var myContext = 0
    override func viewDidLoad() {
        super.viewDidLoad()
        
        
        
        btn.addTarget(self, action: "buttonAction:", forControlEvents: UIControlEvents.TouchUpInside);
        
        _view1 = NewView(frame: CGRectMake(100,50,100,100));
        _view1.backgroundColor = UIColor.orangeColor();
        self.view.addSubview(_view1);
        
        
        myObject = MyNSObject();
        _view1.addObserver(self, forKeyPath: "age", options: NSKeyValueObservingOptions.New, context: &myContext);

//        self.myObject.data = NSDate();
        
            self._view1.data = NSDate();
     
        age = 10;
    }

    func buttonAction(btn : UIButton){
    
        age = age + 10;

        let num = NSNumber(integerLiteral: age);
        
        self._view1.age = num;
        
    }
  
    override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
        
        
        
    }

    override func viewDidDisappear(animated: Bool) {
        super.viewDidDisappear(animated);
        //移除监听
        self.removeObserver(self, forKeyPath: "age", context: &myContext);
        
    }
    
}

 

 NewView.swift页面

//
//  NewView.swift
//  swift监听的用法
//
//  Created by mac on 16/2/6.
//  Copyright © 2016年 ZY. All rights reserved.
//

import UIKit

class NewView: UIView {
// 懒加载
//    lazy var label:UILabel = {
//        let label = UILabel(frame: CGRect(x: 0, y: 0, width: 100, height: 40))
//        return label
//    }()
   
    
    
//注解,,,使用监听的时候,基本数据类型,不能作为监听的属性对象,且前面必须用dynamic修饰
    dynamic var age : NSNumber!;
   
    dynamic var data = NSDate();
    
    override init(frame: CGRect) {
        
        super.init(frame: frame);
        

    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }


}

 

---恢复内容结束---

以上是关于Swift中KVO(监听)的使用方法及注意事项的主要内容,如果未能解决你的问题,请参考以下文章

iOS之NSNotificationCenter通知中心使用事项

iOS 设计模式(五)-KVO 详解

操作观察期间的 Swift 4 KVO 致命错误

iOS: 使用KVO监听控制器中数组的变化

Swift 中是不是提供键值观察 (KVO)?

iOS KVO监听数组元素的变化