编程进阶网 编程进阶网
首页
  • 计算机原理
  • 操作系统
  • 网络协议
  • 数据库原理
  • 面向对象
  • 设计原则
  • 设计模式
  • 系统架构
  • 性能优化
  • 编程原理
  • 方案设计
  • 稳定可靠
  • 工程运维
  • 基础认知
  • 线性结构
  • 树与哈希
  • 工业级实现
  • 算法思想
  • 实战与综合
  • 算法题考核
  • C语言入门
  • C综合案例
  • C专栏博客
  • C标准集库
  • C++入门教程
  • C++综合案例
  • C++专栏博客
  • C++开发技巧
  • Java入门教程
  • Java综合案例
  • Java专栏博客
  • Go入门教程
  • Go综合案例
  • Go专栏博客
  • Go开发技巧
  • JavaScript入门
  • JavaScript高级
  • Android库解读
  • Android专栏
  • Android智能硬件
  • iOS ObjC入门
  • iOS Swift入门
  • iOS入门精通
  • Web之Html手册
  • Web之TypeScript
  • Web之Vue高级进阶
  • Linux之QML入门
  • Linux之QT核心库
  • Linux实践开发
  • Python教程
  • Shell&Bash教程
  • 工具脚本
  • 自动化脚本
  • 质量保障
  • 产品思考
  • 软实力
  • 开发流程
  • Git应用
  • 技术模版
  • 技术规范
  • Markdown
  • Mermaid
  • 开源协议
  • JSON工具
  • 文本工具
  • 图片处理
  • 文档转化
  • 代码压缩
  • 关于我
  • 自我精进
  • 职场管理
  • 职场面试
  • 心情杂货
  • 友情链接

杨充

专注编程 · 终身学习者
首页
  • 计算机原理
  • 操作系统
  • 网络协议
  • 数据库原理
  • 面向对象
  • 设计原则
  • 设计模式
  • 系统架构
  • 性能优化
  • 编程原理
  • 方案设计
  • 稳定可靠
  • 工程运维
  • 基础认知
  • 线性结构
  • 树与哈希
  • 工业级实现
  • 算法思想
  • 实战与综合
  • 算法题考核
  • C语言入门
  • C综合案例
  • C专栏博客
  • C标准集库
  • C++入门教程
  • C++综合案例
  • C++专栏博客
  • C++开发技巧
  • Java入门教程
  • Java综合案例
  • Java专栏博客
  • Go入门教程
  • Go综合案例
  • Go专栏博客
  • Go开发技巧
  • JavaScript入门
  • JavaScript高级
  • Android库解读
  • Android专栏
  • Android智能硬件
  • iOS ObjC入门
  • iOS Swift入门
  • iOS入门精通
  • Web之Html手册
  • Web之TypeScript
  • Web之Vue高级进阶
  • Linux之QML入门
  • Linux之QT核心库
  • Linux实践开发
  • Python教程
  • Shell&Bash教程
  • 工具脚本
  • 自动化脚本
  • 质量保障
  • 产品思考
  • 软实力
  • 开发流程
  • Git应用
  • 技术模版
  • 技术规范
  • Markdown
  • Mermaid
  • 开源协议
  • JSON工具
  • 文本工具
  • 图片处理
  • 文档转化
  • 代码压缩
  • 关于我
  • 自我精进
  • 职场管理
  • 职场面试
  • 心情杂货
  • 友情链接
  • README
  • Android提升进阶

  • iOS开发和进阶

    • README
    • ObjC编程入门

    • Swift编程入门

    • iOS入门到精通

      • iOS入门到精通案例
      • UIKit框架原理探索
      • UIViewController
      • 项目工程面板说明
      • 通信实践和设计思想
        • 01.Controller间如何通信
          • 1.1 委托模式通信
          • 1.2 使用通知中心通信
          • 1.3 使用闭包通信
          • 1.4 使用单例模式通信
          • 1.5 共享数据模型通信
          • 1.6 如何选择合适方式
      • 网络请求和数据解析
      • 多线程实践和原理
      • Swift和OC混编开发
      • Swift版SnapKit布局
      • 开发SDK实践设计
      • iOS经验类笔记积累
  • Web开发和进阶

  • Linux应用开发

  • Apps
  • iOS开发和进阶
  • iOS入门到精通
杨充
2025-03-19
目录

通信实践和设计思想

# 10.通信实践和设计思想

# 目录介绍

  • 01.Controller间如何通信
    • 1.1 委托模式通信
    • 1.2 使用通知中心通信
    • 1.3 使用闭包通信
    • 1.4 使用单例模式通信
    • 1.5 共享数据模型通信
    • 1.6 如何选择合适方式

# 01.Controller间如何通信

视图控制器(View Controller)之间可以通过多种方式进行通信。以下是一些常见的方法:

  1. 使用委托模式(Delegate Pattern):通过定义协议(Protocol)和委托(Delegate)来实现视图控制器之间的通信。
  2. 使用通知中心(Notification Center): 视图控制器可以通过通知中心发送和接收通知。
  3. 使用闭包(Closure):一个视图控制器可以将一个闭包作为参数传递给另一个视图控制器,并在需要时调用该闭包来传递数据或执行特定的操作。
  4. 使用单例模式(Singleton Pattern):通过创建一个全局可访问的单例对象,视图控制器之间可以共享数据和状态。
  5. 使用共享的数据模型:视图控制器之间可以共享一个数据模型对象,通过对该对象进行读写操作来进行通信。

# 1.1 委托模式通信

通过定义协议(Protocol)和委托(Delegate)来实现视图控制器之间的通信。

一个视图控制器可以成为另一个视图控制器的委托,并实现协议中定义的方法来接收和处理事件或数据。

如何在两个视图控制器之间使用委托模式进行通信。通过定义协议(Protocol)和委托(Delegate)来实现通信。代码如下所示

第一步:定义一个协议 DataDelegate,其中包含一个方法 didReceiveData

protocol DataDelegate: AnyObject {
    func didReceiveData(data: String)
}
1
2
3

第二步:在B视图控制器 SenderViewController,声明委托属性和触发委托方法

class SenderViewController: UIViewController {

    weak var delegate: DataDelegate?
    
    //触发委托方法
    func sendData() {
        let data = "Hello, World!"
        delegate?.didReceiveData(data: data)
    }
}
1
2
3
4
5
6
7
8
9
10

第三步:在A视图控制器 ReceiverViewController中,设置协议委托并接收数据

//ReceiverViewController 类需要实现前面定义的协议 DataDelegate
class ReceiverViewController: UIViewController, DataDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        let senderVC = SenderViewController()
        //将自身设置为 SenderViewController 的委托
        senderVC.delegate = self
        senderVC.sendData()
    }
    
    func didReceiveData(data: String) {
        print("Received data: \(data)")
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

通过委托模式,SenderViewController 和 ReceiverViewController 之间可以进行通信,并传递数据。

# 1.2 使用通知中心通信

视图控制器可以通过通知中心发送和接收通知。

一个视图控制器可以发送一个通知,而其他视图控制器可以通过注册为观察者来接收并响应该通知。

通知中心提供了一种发布-订阅模式,允许一个视图控制器发布通知,而其他视图控制器可以订阅并接收这些通知。

第一步:在B视图控制器 SenderViewController,使用 NotificationCenter 的 post 方法发布一个名为 "MyNotification" 的通知。

class SenderViewController: UIViewController {
    func sendData() {
        //发布一个名为 "MyNotification" 的通知。
        NotificationCenter.default.post(name: NSNotification.Name("MyNotification"), object: nil)
    }
}
1
2
3
4
5
6

第二步:在A视图控制器 ReceiverViewController,使用 NotificationCenter 的 addObserver 方法订阅名为 "MyNotification" 的通知,并指定一个处理通知的方法 handleNotification。

class ReceiverViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        //订阅了该通知,并在接收到通知时打印出相应的消息
        NotificationCenter.default.addObserver(self, selector: #selector(handleNotification), name: NSNotification.Name("MyNotification"), object: nil)
    }
    
    @objc func handleNotification() {
        print("Received notification")
    }
    
    deinit {
        NotificationCenter.default.removeObserver(self)
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

注意的是,在 deinit 方法中,我们使用 NotificationCenter 的 removeObserver 方法取消订阅通知,以避免内存泄漏。

# 1.3 使用闭包通信

一个视图控制器可以将一个闭包作为参数传递给另一个视图控制器,并在需要时调用该闭包来传递数据或执行特定的操作。

第一步:创建一个发送数据的视图控制器 SenderViewController。声明了一个闭包属性 dataClosure,用于接收数据的回调。在 sendData 方法中,我们将数据传递给闭包。

class SenderViewController: UIViewController {

    var dataClosure: ((String) -> Void)?
    
    func sendData() {
        let data = "Hello, World!"
        dataClosure?(data)
    }
}
1
2
3
4
5
6
7
8
9

第二步:创建一个接收数据的视图控制器 ReceiverViewController。将接收数据的闭包赋值给 dataClosure 属性。

class ReceiverViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        let senderVC = SenderViewController()
        senderVC.dataClosure = { [weak self] data in
            self?.handleData(data: data)
        }
    }
    
    func handleData(data: String) {
        print("Received data: \(data)")
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 1.4 使用单例模式通信

通过创建一个全局可访问的单例对象,视图控制器之间可以共享数据和状态。

# 1.5 共享数据模型通信

视图控制器之间可以共享一个数据模型对象,通过对该对象进行读写操作来进行通信。

# 1.6 如何选择合适方式

选择合适的通信方式取决于你的具体需求和场景。以下是一些常见的情况和对应的通信方式:

  1. 委托模式(Delegate Pattern):适用于一对一的通信关系,其中一个对象(委托)将自身的行为委托给另一个对象(委托对象)。委托模式适用于需要回调和数据传递的情况,例如视图控制器之间的通信。
  2. 通知中心(Notification Center):适用于一对多的通信关系,其中一个对象发布通知,而其他对象可以订阅并接收这些通知。通知中心适用于需要广播消息的情况,例如系统事件、状态变化等。
  3. 闭包(Closure):适用于简单的一次性通信,其中一个对象将一个闭包传递给另一个对象,以便在需要时调用。闭包适用于需要传递回调或处理结果的情况,例如异步操作的回调。
  4. 共享数据模型:适用于需要在多个对象之间共享数据的情况。通过创建一个共享的数据模型对象,多个对象可以访问和修改该对象的属性来进行通信。
上次更新: 2026/06/10, 11:13:41
项目工程面板说明
网络请求和数据解析

← 项目工程面板说明 网络请求和数据解析→

最近更新
01
信号崩溃快速排查
06-15
02
CoreDump破案
06-15
03
perf火焰图实战
06-15
更多文章>
Theme by Vdoing | Copyright © 2019-2026 杨充 | MIT License | 桂ICP备2024034950号 | 桂公网安备45142202000030
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式