观察者模式

2017-11-28  本文已影响0人  古月思吉

一、有参数的观察者模式:

<1>传递Object对象参数:

0.观察者对象宏定义:

let kAliPayNotificationName = Notification.Name("aliPayNotification")// 支付宝支付结果通知
let kAliPaySuccessNotificationObject = "aliPaySuccess"  //支付成功
let kAliPayFailNotificationObject = "aliPayFail"    //支付失败

1.添加观察者 & 监听方法实现 & 移除观察者:

//(1)添加支付宝支付结果观察者
NotificationCenter.default.addObserver(self, selector: #selector(aliPayNotificationAction(notification:)), name: kAliPayNotificationName, object: nil)

//(2)接收到通知的方法-支付宝支付结果
func aliPayNotificationAction(notification:Notification) {
    guard notification.object != nil else {
        return
    }
    if let notificationObjectStr = notification.object! as? String {
        if (notificationObjectStr == kAliPaySuccessNotificationObject) {
            print("支付成功!")
            self.title = "支付成功"
            self.view.addSubview(self.paySuccessView)
            self.view.bringSubview(toFront: self.paySuccessView)
        } else if (notificationObjectStr == kAliPayFailNotificationObject) {
            print("支付失败!")
            self.title = "支付失败"
            self.view.addSubview(self.payFailView)
            self.view.bringSubview(toFront: self.payFailView)
        } else {
            return
        }
    }
}

//(3)移除观察者
deinit {
    NotificationCenter.default.removeObserver(self)
}

3.发送通知:

if resultStatus == "9000" {//支付成功
    NotificationCenter.default.post(name: kAliPayNotificationName, object: kAliPaySuccessNotificationObject)
} else {//支付失败
    NotificationCenter.default.post(name: kAliPayNotificationName, object: kAliPayFailNotificationObject)
}

<2>传递userInfo参数:
0.观察者对象宏定义:

let kChineseAudioPlayPlayModelCheckNotice = Notification.Name("kChineseAudioPlayPlayModelCheckNotice")//音频播放方式切换的通知

1.添加观察者 & 监听方法实现 & 移除观察者:

//添加观察者
        NotificationCenter.default.addObserver(self, selector: #selector(sequenceTypeCheckNoticeAction(notification:)), name: kChineseAudioPlaySequenceTypeCheckNotice, object: nil)

//MARK: - 观察者监听方法
    func sequenceTypeCheckNoticeAction(notification:Notification) {
        guard notification.userInfo != nil else {
            return
        }
        if let notificationUserInfoDict = notification.userInfo! as? [String: AnyObject] {
            if let value = notificationUserInfoDict["playMode"] as? Int {
                self.sequenceType = AudioSequenceType(rawValue: value) ?? .order
                self.tableView.mj_header.beginRefreshing()
            }
        }
        return
    }

deinit {
        //移除观察者
        NotificationCenter.default.removeObserver(self)
    }

3.发送通知:

//发送通知
NotificationCenter.default.post(name: kChineseAudioPlayPlayModelCheckNotice, object: nil, userInfo: ["playMode": playMode.rawValue])

二、无参数的观察者模式:

let kloginSuccessNotice = Notification.Name("BookRoomRefreshData")
//发送通知
NotificationCenter.default.post(name: kloginSuccessNotice, object: nil)
//添加观察者
NotificationCenter.default.addObserver(self, selector: #selector(loginSuccessAction), name: kloginSuccessNotice, object: nil)
//在添加观察者VC,实现监测到通知后的动作方法
func loginSuccessAction() {
        loadData()
    }
//销毁观察者
deinit {
        NotificationCenter.default.removeObserver(self)
    }

三、添加系统通知的观察者:

//添加系统通知的观察者
NotificationCenter.default.addObserver(self, selector: #selector(didEnterBackground), name: NSNotification.Name.UIApplicationDidEnterBackground, object: nil )
上一篇下一篇

猜你喜欢

热点阅读