iOS swift 代理 delegate protocol 和 通知(NSNotification)

文章目录

  • 1.代理
    • 1.1 概述 苹果官网文档
    • 1.2 代码和demo
      • 代码
        • 协议和委托方,协议里声明方法,委托方的delegate属性遵守代理,并且用weak修饰,规避循环引用.delegate调用代理方法
        • 代理方,成为委托方的代理,类遵守协议,实现代理方法
      • demo下载
    • 1.3 参考博客:
  • 2.通知
    • 2.1 概述
    • 2.2 通知简单使用的实例(swift)
  • 3. block,代理,通知的区别
  • 我的另外一篇博客

1.代理

1.1 概述 苹果官网文档

苹果官网文档:apple developer - delegate

  • 苹果官方的介绍:代理(委托)是一种设计模式,它允许类或结构体将其部分职责代理给另一个类型的实例。这种设计模式是通过定义一个封装代理职责的协议来实现的,这样一个符合要求的类型(称为代理)就可以保证提供已代理的功能。可以使用代理来响应特定的操作,或者从外部源检索数据,而不需要知道该源的底层类型
  • 代理是一种软件设计模式,也是一种消息传递方式
  • iOS中以@protocol的形式体现
  • 传递方式一对一
  • 通过代理模式可以在代理方和委托方之间传递信息
  • optional:可以实现可不实现
  • 没加optional: 一定要实现, respondsToSelector来检查是否实现了代理方法
    iOS swift 代理 delegate protocol 和 通知(NSNotification)_第1张图片

1.2 代码和demo

代码

协议和委托方,协议里声明方法,委托方的delegate属性遵守代理,并且用weak修饰,规避循环引用.delegate调用代理方法

import UIKit

protocol TestViewDelegate : class {
     
    func getLabelText(labelText:String) -> UIColor
}

class TestView: UIView {
     
    
    weak var delegate:TestViewDelegate?
    
    private let currentColor = UIColor.red
    
    @IBOutlet  private var label: UILabel!
    
    
    @IBAction func btnClick(_ sender: UIButton) {
     
        backgroundColor = delegate?.getLabelText(labelText: label.text!)
    }
    
    
}

代理方,成为委托方的代理,类遵守协议,实现代理方法

import UIKit

class ViewController: UIViewController, TestViewDelegate {
     
    func getLabelText(labelText: String) -> UIColor {
     
        print(labelText)
        return color
    }

    let color = UIColor.yellow
    
    override func viewDidLoad() {
     
        super.viewDidLoad()
        
        let arr = Bundle.main.loadNibNamed("TestView", owner: nil, options: nil)
        let testView:TestView = arr![0] as! TestView
        testView.delegate = self
        
        
        testView.center = view.center
        view.addSubview(testView)
    }


}

demo下载

Gitee - iosDelegate

1.3 参考博客:

iOS代理模式
iOS swift 代理协议

2.通知

2.1 概述

  • 通知是使用观察者模式来实现的用于跨层传递消息的机制
  • 传递方式为一对多
  • 在iOS开发中消息通知机制就是通过消息,来达到通知的目的。我们需要在通知中心注册我们想要监听的消息,当项目中有地方发出这个消息的时候,通知中心会发送给注册这个消息的对象

iOS swift 代理 delegate protocol 和 通知(NSNotification)_第2张图片

2.2 通知简单使用的实例(swift)

iOS oc swift 通知的简单使用

3. block,代理,通知的区别

  • 代理和block都可以双向传值,通知只能单向传值。通知的消息只能从发通知的这边传到订阅通知的这边,不能反过来;代理,委托方在调用代理方法的时候,值可以通过方法参数传到代理方,同时代理方那边也可以通过方法的返回值传值到委托方;block的调用方和实现方之间也可以相互传值
  • 传递方式通知是一对多,代理和block是一对一
  • 通知可跨层级传值,代理是相邻两层直接传值,block通过逃逸闭包也可以实现跨层级的传值
  • 代理和block的异同
    代理和block都可以实现相邻层级之间的消息传递
  • 代理是一种设计模式,通过这种设计模式,类或是结构体(委托方)可以找一个代理来帮他实现部分功能,具体要实现哪些功能是封装在一个协议里面的,某一个类遵守了协议,那么他的实例就可以成为委托方的代理,他就需要实现协议里的方法。通过代理模式可以实现代理方和委托方之间值和信息的相互传递
  • 代理是协议可以实现的一部分功能,而block是一个匿名函数
  • block的代码可读性更好,使用起来更方便,因为应用block和实现block的地方在一起,而代理的声明和实现是分开的,以蓝牙发数据成功为例
  • block就是一个对象,实现了匿名函数的功能,block可以作为成员变量,属性,参数使用,使用起来非常灵活
  • block的运行成本更高,block出栈需要将代码和数据从栈内存拷贝到堆内存。而delegate只保存了一个对象指针,只多了一个查表的动作
  • 优先使用block,如果回调函数多,或是回调函数多于3个使用代理

iOS block和代理的区别
iOS代理,通知,block的用法及不同

我的另外一篇博客

iOS 代理(Delegate)和通知(NSNotification)

你可能感兴趣的:(ios,ios,swift)