我是靠谱客的博主 任性手机,最近开发中收集的这篇文章主要介绍iOS swift 代理 delegate protocol 和 通知(NSNotification)1.代理2.通知3. block,代理,通知的区别我的另外一篇博客,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

返回上级目录:几乎是默写出来,加上自己理解的博客(iOS面试)

文章目录

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

1.代理

iOS 组件通信方案 - 简书

请添加图片描述

1.1 概述 苹果官网文档 protocol

  • A protocol defines a blueprint of methods, properties, and other requirements that suit a particular task or piece of functionality. The protocol can then be adopted by a class, structure, or enumeration to provide an actual implementation of those requirements. Any type that satisfies the requirements of a protocol is said to conform to that protocol.
  • 协议定义了适合特定任务或功能块的方法、属性和其他需求的蓝图。然后,类、结构或枚举可以采用该协议,以提供这些需求的实际实现。任何满足协议要求的类型都被称为符合该协议。
    苹果官网文档:apple developer - delegate
  • 苹果官方的介绍:代理(委托)是一种设计模式,它允许类或结构体将其部分职责代理给另一个类型的实例。这种设计模式是通过定义一个封装代理职责的协议来实现的,这样一个符合要求的类型(称为代理)就可以保证提供已代理的功能。可以使用代理来响应特定的操作,或者从外部源检索数据,而不需要知道该源的底层类型
  • 代理是一种软件设计模式,也是一种消息传递方式
  • iOS中以@protocol的形式体现
  • 传递方式一对一
  • 通过代理模式可以在代理方和委托方之间传递信息
  • optional:可以实现可不实现
  • 没加optional: 一定要实现, respondsToSelector来检查是否实现了代理方法
    请添加图片描述

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开发中消息通知机制就是通过消息,来达到通知的目的。我们需要在通知中心注册我们想要监听的消息,当项目中有地方发出这个消息的时候,通知中心会发送给注册这个消息的对象

请添加图片描述

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个使用代理

3.1 block和代理的区别

  • 显示蓝牙连接状态的时候用代理比用block好,block在连接成的每个地方都要写,代理只需要在一个地方写

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

我的另外一篇博客

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

最后

以上就是任性手机为你收集整理的iOS swift 代理 delegate protocol 和 通知(NSNotification)1.代理2.通知3. block,代理,通知的区别我的另外一篇博客的全部内容,希望文章能够帮你解决iOS swift 代理 delegate protocol 和 通知(NSNotification)1.代理2.通知3. block,代理,通知的区别我的另外一篇博客所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(60)

评论列表共有 0 条评论

立即
投稿
返回
顶部