我是靠谱客的博主 任性手机,最近开发中收集的这篇文章主要介绍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,代理,通知的区别我的另外一篇博客所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复