IOS中不同组件的通信

一、iOS中两种方式实现不同组件的通信,一种是松耦合的方式,一是紧耦合的方式。

1、NSNotifacationCenter让应用中内不同组件以松耦合的方式进行通信。

(1)注册、删除监听者

[[NSNotificationCenter defaultCenter]  addObserver:self selector:@selector(mytest:) name:@" mytest" object:nil]

参数介绍:

addObserver: 观察者,即在什么地方接收通知;

selector: 收到通知后调用何种方法;

name: 通知的名字,也是通知的唯一标示,编译器就通过这个找到通知的。


移除observer                                           

  [[NSNotificationCenter defaultCenter] removeObserver:self name:@"postData" object:nil];

   (2)  发送通知

[[NSNotificationCenter defaultCenter] postNotificationName:@"mytest" object:searchFriendArray];

参数:

postNotificationName:通知的名字,也是通知的唯一标示,编译器就通过这个找到通知的。

object:传递的参数



2、delegate让应用中不同组件以紧耦合的方式进行通信。

当A组件需要监听B组件的事件或处理B组件的状态改变时,A实现B组件内部的delegate协议,并将A组件设置为B组件的delegate属性。


二、他们的区别又是什么呢?

Delegate:

消息的发送者(sender)告知接收者(receiver)某个事件将要发生,delegate同意然然后发送者响应事件,delegate机制使得接收者可以改变发送者的行为。通常发送者和接收者的关系是直接的一对多的关系。

Notification:

消息的发送者告知接收者事件已经发生或者将要发送,仅此而已,接收者并不能反过来影响发送者的行为。通常发送者和接收者的关系是间接的多对多关系。

1. 效率肯定是delegate比nsnotification高。

2. delegate方法比notification更加直接,最典型的特征是,delegate方法往往需要关注返回值,也就是 delegate方法 的结果。比如-windowShouldClose:,需要关心返回的是yes还是no。所以delegate方法往往包含should这个很传神的词。 也就是好比你做我的delegate,我会问你我想关闭窗口你愿意吗?你需要给我一个答案,我根据你的答案来决定如何做下一步。相反 的,notification最大的特色就是不关心接受者的态度,我只管把通告放出来,你接受不接受就是你的事情,同时我也不关心结果。所以 notification往往用did这个词汇,比如NSWindowDidResizeNotification,那么nswindow对象放出这个 notification后就什么都不管了也不会等待接受者的反应。

1)两个模块之间联系不是很紧密,就用notification传值,例如多线程之间传值用notificaiton。

2)delegate只是一种较为简单的回调,且主要用在一个模块中,例如底层功能完成了,需要把一些值传到上层去,就事先把上层的函数通过 delegate传到底层,然后在底层call这个delegate,它们都在一个模块中,完成一个功能,例如 说 NavgationController 从 B 界面到A 点返回按钮 (调用popViewController方法) 可以用delegate 比较好。


### iOS 组件化架构下的通信方式实现 在 iOS 开发中,组件化是一种常见的设计模式,用于将应用拆分为多个独立的功能模块。这种结构不仅提高了代码的可维护性和扩展性,还便于团队协作开发。以下是几种常用的组件通信方式及其具体实现。 #### 1. Target-Action 模式 Target-Action 是一种经典的事件处理机制,在组件化架构中可以通过 `CTMediator` 或类似的工具来实现跨模块间的交互。其核心思想是通过注册目标对象和动作方法完成功能调用[^1]。 例如: ```objc // 注册 Target 和 Action [self registerTarget:self withAction:@"moduleAAction:"]; ``` 当其他模块需要调用此功能时,可以传递参数并通过统一接口触发对应的动作。 --- #### 2. 使用 Runtime 动态加载类与方法 利用 Objective-C 的 runtime 特性以及 category 扩展能力,可以在运行时动态获取模块中的类并创建实例,或者通过 `performSelector:` 调用指定的方法[^2]。 示例代码如下: ```objc NSString *className = @"ModuleName.ClassName"; Class moduleClass = NSClassFromString(className); if (moduleClass) { id instance = [[moduleClass alloc] init]; if ([instance respondsToSelector:@selector(doSomething:)]) { [instance performSelector:@selector(doSomething:) withObject:param]; } } ``` 这种方式的优点在于无需提前导入头文件即可访问其他模块的内容,缺点则是增加了耦合度且调试难度较高。 --- #### 3. 协议代理(Delegate) 协议代理是最常见的一种解耦手段之一。每个子模块定义自己的公开协议供外部遵循;而父级控制器则作为委托方负责接收回调数据。这样既保持了各部分之间的低依赖关系又实现了高效的信息交换。 假设 ModuleB 需要向 ModuleA 返回某些结果,则可在两者之间建立联系: ```objc @protocol ModuleADelegate <NSObject> @required -(void)didReceiveDataFromModuleB:(id)data; @end @interface ModuleBViewController : UIViewController @property (nonatomic, weak) id<ModuleADelegate> delegate; @end ``` 随后由 A 设置自己为 B 的代理,并实现代理方法以捕获返回值。 --- #### 4. Notification Center (通知中心) 苹果官方提供的 NotificationCenter 提供了一种广播式的通讯渠道。任何地方都可以发送特定名称的通知消息,同时允许任意数量的对象监听这些信号从而做出响应。 下面是一个简单的例子展示如何使用它来进行跨页面跳转操作: ```objc // 发送通知 NSDictionary *userInfo = @{@"key": value}; [[NSNotificationCenter defaultCenter] postNotificationName:@"SwitchPageNotification" object:nil userInfo:userInfo]; // 接收通知 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleSwitchPage:) name:@"SwitchPageNotification" object:nil]; ``` 尽管这种方法简单易用,但在大规模项目里容易造成难以追踪的问题链路混乱现象因此需谨慎采用。 --- #### 5. Flutter 中的 EventChannel 进行混合开发通信 对于涉及多端协同工作的场景比如原生 ios 应用嵌入 flutter 页面的情况之下 , 可借助 event channel 完成双向实时同步 。 创建一个继承自 `FlutterStreamHandler` 的新类 , 并重写其中几个关键函数用来管理 stream lifecycle . ```swift import Flutter public class EventChannelDemo:NSObject, FlutterStreamHandler{ private var eventSink: FlutterEventSink? public func onListen(withArguments arguments: Any?, eventSink events: @escaping FlutterEventSink) -> FlutterError? { self.eventSink = events startListening() return nil } public func onCancel(withArguments arguments: Any?) -> FlutterError? { stopListening() self.eventSink = nil return nil } private func send(event:Any){ guard let sink = self.eventSink else {return;} sink(event) } } extension EventChannelDemo{ // 自定义逻辑... } ``` 上述片段展示了如何构建基于流模型的数据传输管道[^3]. --- ### 总结 综上所述,iOS 组件化架构下存在多种可行的通信解决方案,开发者应根据实际需求权衡选用最合适的那一种。无论是传统的 target-action 方法还是现代化框架支持下的异步信道都各有千秋值得深入研究学习.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值