delegate和notification区别,分别在什么情况下使用?

Delegate:

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

Notification:

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


区别:

1. 效率肯定是delegatensnotification高。

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


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

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在iOS 10及以后的版本中,可以使用UNUserNotificationCenterDelegate协议的userNotificationCenter(_:didReceive:withCompletionHandler:)方法来处理新通知的接收,并在需要的情况下删除以前发送的通知。 具体步骤如下: 1. 在AppDelegate中设置UNUserNotificationCenter的delegate: ``` UNUserNotificationCenter.current().delegate = self ``` 2. 实现UNUserNotificationCenterDelegate协议的userNotificationCenter(_:didReceive:withCompletionHandler:)方法: ``` func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) { // 处理新通知的接收 // ... // 删除以前发送的通知 let notificationId = "previous_notification_id" UNUserNotificationCenter.current().removeDeliveredNotifications(withIdentifiers: [notificationId]) // 调用completionHandler,告诉系统已经处理完通知 completionHandler() } ``` 在上面的代码中,我们首先处理新通知的接收,然后调用UNUserNotificationCenter的removeDeliveredNotifications(withIdentifiers:)方法来删除以前发送的通知。这个方法接受一个通知ID的数组作为参数,表示要删除哪些通知。 最后,我们需要在方法的最后调用completionHandler(),告诉系统已经处理完通知。这个方法是一个闭包,需要在方法结束时调用,否则系统会认为通知没有被处理,导致通知栏上的通知一直存在。 需要注意的是,removeDeliveredNotifications(withIdentifiers:)方法只能删除已经发送并且已经显示在通知栏上的通知,不能删除尚未发送或者已经被用户手动删除的通知。如果需要删除尚未发送的通知,可以使用UNUserNotificationCenter的removePendingNotificationRequests(withIdentifiers:)方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值