【swift3.0】- 通知使用NotificationCenter
2016-11-22 00:00
225 查看
贡献作者 -【XJDomain】
博客XJ: https://my.oschina.net/shengbingli/blog GitHub: https://github.com/lishengbing/XJQRCodeToolDemo
bug:如果监听不到通知:马上想到就是可能先发出了,再监听去了
object:(谁发送的通知) 一般情况下我们可以不传,置为nil表示<匿名发送> ,如果我们只需要传入一个参数的话,比如说本身控制器或者该类中的某一个控件的话,我们就可以使用object传出去,例子如下
只传入一个object:参数的控件:
传入多个参数需要使用userInfo传入:
上面通知调用方法: 没有参数的方法
--------------------------------------------------------------
上面通知调用方法: 有参数的方法
好处是:不需要我们再写一个方法
坏处是:移除通知相比麻烦,但是还好
移除通知:
01-先定义一个属性
weak var observe : NSObjectProtocol?
02-接收通知返回来的观察者
03-在移除通知方法中移除通知
博客XJ: https://my.oschina.net/shengbingli/blog GitHub: https://github.com/lishengbing/XJQRCodeToolDemo
通知⚠️:
通知是由顺序的,必须先监听,再发出,bug:如果监听不到通知:马上想到就是可能先发出了,再监听去了
1:发送通知方法一:
name:一般情况下我们需要定义成一个常量, 如:kNotiAddPhotoobject:(谁发送的通知) 一般情况下我们可以不传,置为nil表示<匿名发送> ,如果我们只需要传入一个参数的话,比如说本身控制器或者该类中的某一个控件的话,我们就可以使用object传出去,例子如下
NotificationCenter.default.post(name: <#T##NSNotification.Name#>, object: <#T##Any?#>)
// 由于事件要多级传递,所以才用通知,代理和回调其实也是可以的 NotificationCenter.default.post(name: NSNotification.Name(rawValue: kNotiAddPhoto), object: nil)
只传入一个object:参数的控件:
@IBAction func closeBtnClick() { NotificationCenter.default.post(name: NSNotification.Name(rawValue: kNotiRemovePhoto), object: imageView.image) }
传入多个参数需要使用userInfo传入:
NotificationCenter.default.post(name: <#T##NSNotification.Name#>, object: <#T##Any?#>, userInfo: <#T##[AnyHashable : Any]?#>)
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "你定义的名字name"), object: nil, userInfo:["name" : "XJDomain", "age" : 18])
1.1接收通知方法一:
NotificationCenter.default.addObserver(<#T##observer: Any##Any#>, selector: <#T##Selector#>, name: <#T##NSNotification.Name?#>, object: <#T##Any?#>)
// 接受添加图片的通知 NotificationCenter.default.addObserver(self, selector: #selector(addPhoto), name: Notification.Name.init(rawValue: kNotiAddPhoto), object: nil)
上面通知调用方法: 没有参数的方法
// 添加照片 @objc fileprivate func addPhoto(){ // 方法调用 }
--------------------------------------------------------------
// 接受删除图片的通知 NotificationCenter.default.addObserver(self, selector: #selector(removePhoto(noti:)), name: NSNotification.Name(rawValue: kNotiRemovePhoto), object: nil)
上面通知调用方法: 有参数的方法
// 删除照片 @objc fileprivate func removePhoto(noti : Notification) { guard let image = noti.object as? UIImage else { return } guard let index = images.index(of: image) else { return } images.remove(at: index) picPickerCollectionView.images = images }
1.2移除通知:
在接收通知控制器中移除的,不是在发送通知的类中移除通知的// 移除通知<通知移除是在发通知控制器中移除> deinit { NotificationCenter.default.removeObserver(self) }
1.3 高手使用的通知:
在接收通知的时候有另外一个方法:好处是:不需要我们再写一个方法
坏处是:移除通知相比麻烦,但是还好
// name: 通知名字 // object :谁发出的通知,一般传nil // queue :队列:表示决定block在哪个线程中去执行,nil表示在发布通知的线程中执行 // using :只要监听到了,就会执行这个block // 一定要移除,不移除的话会存在坏内存访问,移除的话需要定义一个属性observe来接收返回对象,然后在移除方法中移除即可 observe = NotificationCenter.default.addObserver(forName: Notification.Name.init(rawValue: kNotiAddPhoto), object: nil, queue: nil) { (Notification) in print("-------------",Thread.current) }
移除通知:
01-先定义一个属性
weak var observe : NSObjectProtocol?
02-接收通知返回来的观察者
observe = NotificationCenter.default.addObserver(forName: Notification.Name.init(rawValue: kNotiAddPhoto), object: nil, queue: nil) { (Notification) in print("-------------",Thread.current) }
03-在移除通知方法中移除通知
// 移除通知<通知移除是在发通知控制器中移除> deinit { //NotificationCenter.default.removeObserver(self) NotificationCenter.default.removeObserver(observe!) }
相关文章推荐
- 使用 AIDE 实现高效率,第 4 部分: 接触点通知与简单管理器
- 通知php使用自定义的session处理函数来操作session,而不使用php预置的方法
- 使用Mina实现RPC调用,消息通知,广播。
- 使用SqlDependency监听SqlServer2005数据库变更通知
- 《关于推进企业使用正版软件工作的实施方案》的通知(2006)
- 使用Before通知的形式实现
- 号外:老方关于IM使用的通知!
- 使用Spring注解方试实现AOP2--环绕通知(周围通知)
- 使用ASP.NET AJAX开发服务器端事件通知器
- C++扩展存储过程编程--使用UDP发送数据库的更新通知
- 使用Spring 2.0新特性实现前置通知--基于Schema方式
- 如何使用通知列表只显示标题
- MOSS 2007 应用随笔(27)-- 使用通知(二)
- 使用Spring 2.0新特性实现前置通知--基于Annotation方式
- 使用.NET事件模型通知文件拷贝进度
- 看到一个关于禁止使用“老板娘”称呼的通知
- 使用 Lotus Sametime 在 Web 应用程序中实现通知
- SqlServer通知与SqlDependency类使用示例
- Sql Server 2005/2008 SqlCacheDependency查询通知的使用总结
- 让 Firefox 3.6.6 使用 Ubuntu 的通知系统