通知
通知是iOS
開發(fā)中常用的一種設(shè)計模式丧鸯,在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
中蚊锹,當(dāng)類釋放的時候审胸,需要主動釋放掉通知的通知瞒窒。
// 刪除通知
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
Swift:NotificationCenter
NotificationCenter
是Swift
中的拋通知類,其和Objective-C
中的NSNotificationCenter
類似励七,但是在某些方面是有些區(qū)別的。
拋通知
Swift
中的拋通知調(diào)用方法: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]?
作為參數(shù)奔缠,這在 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)
}
應(yīng)用
這里實現(xiàn)了一個簡單的點擊拋出通知按鈕两波,可以隨機改變自定義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)
}
簡單的實現(xiàn)效果圖如下:
總結(jié)
通知是iOS
開發(fā)和Mac OSX
開發(fā)常用的一種設(shè)計模式,其在Swift
語言下的使用和Objective-C
稍微有細(xì)微差別雨女。此文做了簡單的比較記錄谚攒,后續(xù)再使用Swift
開發(fā)APP
的時候,可以拿來使用氛堕。