通知
通知是iOS
开发中常用的一种设计模式,在Objective-C
和Swift
中的使用是有差别的。
Objective-C:NSNotificationCenter
抛通知
抛出通知需要使用方法:- (void)postNotificationName:(NSNotificationName)aName object:(nullable id)anObject userInfo:(nullable NSDictionary *)aUserInfo;
// OC语言抛通知
NSDictionary *userInfo = {@"bkColor": backgroundColor};
[[NSNotificationCenter defaultCenter] postNotificationName:@"kBackgroundColorChangeNotify" object:nil userInfo:userInfo];
接收通知
接收通知需要使用方法:- (void)addObserver:(id)observer selector:(SEL)aSelector name:(nullable NSNotificationName)aName object:(nullable id)anObject;
// 接收通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onBackgroundColorChanged:) name:@"kBackgroundColorChangeNotify" object:nil];
// 收到通知之后需要做的事情
- (void)onBackgroundColorChanged:(NSNotification *)notify {
NSDictionary *userInfo = [notify userInfo];
NSColor *color = userInfo[@"bkColor"];
// Do Something
}
删除通知
在Objective-C
中,当类释放的时候,需要主动释放掉通知的通知。
// 删除通知
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
Swift:NotificationCenter
NotificationCenter
是Swift
中的抛通知类,其和Objective-C
中的NSNotificationCenter
类似,但是在某些方面是有些区别的。
抛通知
Swift
中的抛通知调用方法:post(name aName: NSNotification.Name, object anObject: Any?, userInfo aUserInfo: [AnyHashable : Any]? = nil)
let userInfo = ["bkColor": backgroundColor]
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "kBackgroundColorChangeNotify"), object: nil, userInfo: userInfo)
注意:
userInfo
使用[AnyHashable:Any]?
作为参数,这在 Swift 中被称作字典字面量。name是
NSNotification.Name
类型的,不是字符串。
接收通知
接收通知需要使用方法:addObserver(_ observer: Any, selector aSelector: Selector, name aName: NSNotification.Name?, object anObject: Any?)
// 接收通知
required init?(coder: NSCoder) {
super.init(coder: coder)
NotificationCenter.default.addObserver(self, selector: #selector(onChangeBackgroundColor), name: NSNotification.Name(rawValue: "kBackgroundColorChangeNotify"), object: nil)
}
// 处理通知
@objc private func onChangeBackgroundColor(_ notify: NSNotification) {
let userInfo = notify.userInfo
let bkColor: NSColor = userInfo!["bkColor"] as! NSColor
self.layer?.backgroundColor = bkColor.cgColor
}
删除通知
deinit {
NotificationCenter.default.removeObserver(self)
}
应用
这里实现了一个简单的点击抛出通知按钮,可以随机改变自定义view的颜色。
其中随机生成颜色的方法如下:
// 随机生成一个颜色
private func randomColor() -> NSColor {
let r: CGFloat = CGFloat.random(in: 0...1)
let g: CGFloat = CGFloat.random(in: 0...1)
let b: CGFloat = CGFloat.random(in: 0...1)
let alpha: CGFloat = 1.0
return NSColor.init(calibratedRed: r, green: g, blue: b, alpha: alpha)
}
简单的实现效果图如下:
notify_01.png总结
通知是iOS
开发和Mac OSX
开发常用的一种设计模式,其在Swift
语言下的使用和Objective-C
稍微有细微差别。此文做了简单的比较记录,后续再使用Swift
开发APP
的时候,可以拿来使用。
网友评论