返回 导航

Swift

hangge.com

Swift - 异步编程库PromiseKit使用详解3(NotificationCenter的扩展)

作者:hangge | 2018-12-07 08:10

四、NotificationCenter 扩展

1,准备工作

我们同样要安装 PromiseKit 库,以及相关的 PMKFoundation 扩展库,具体步骤参考我之前的文章:

2,系统通知的监听和响应

(1)当程序启动后,按下设备的 home 键进入后台时,会发送个 UIApplication.didEnterBackgroundNotification 通知。下面我们监听这个通知并在控制台输出相关信息:
注意:通知响应后,PromiseKit 会自动将相应的通知注册给取消,也就是说每个监听通知都是一次性的。为了让通知能被反复多次监听,这里在响应后继续调用方法进行观察。
import UIKit
import PromiseKit
import PMKFoundation

class ViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //开始监听通知
        beginObserve()
    }
    
    //开始监听通知
    func beginObserve() {
        //监听程序进入后台的通知
        NotificationCenter.default.observe(once:
            UIApplication.didEnterBackgroundNotification).done { notification in
                print("程序进入到后台了")
                //继续接听通知
                self.beginObserve()
        }
    }
}

(2)下面代码分别监听虚拟键盘的打开和关闭通知,并在控制台中输出相关信息。
//监听键盘弹出通知
NotificationCenter.default.observe(once:
    UIResponder.keyboardWillShowNotification).done { notification in
        print("键盘出现了")
}

//监听键盘隐藏通知
NotificationCenter.default.observe(once:
    UIResponder.keyboardWillHideNotification).done { notification in
        print("键盘消失了")
}

3,自定义通知的发送与接收

通知类型其实就是一个字符串,所以我们也可以使用自己定义的通知(同时还可以传递用户自定义数据)。

(1)ViewController.swift(我们发出一个携带有自定义数据的通知,同时创建两个观察者来接收这个通知。)
import UIKit
import PromiseKit
import PMKFoundation

class ViewController: UIViewController {
    
    let observers = [MyObserver(name: "观察器1"),MyObserver(name: "观察器2")]
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        print("发送通知")
        let notificationName = Notification.Name(rawValue: "DownloadImageNotification")
        NotificationCenter.default.post(name: notificationName, object: self,
                                        userInfo: ["value1":"hangge.com", "value2" : 12345])
        print("通知发送完毕")
    }
}

(2)MyObserver.swift(观察者在收到通知后的执行的处理函数中,添加了个 3 秒的等待。)
import UIKit
import PromiseKit
import PMKFoundation

class MyObserver: NSObject {
    
    var name:String = ""
    
    init(name:String){
        super.init()
        
        self.name = name
        
        //开始观察
        beginObserver()
    }
    
    //开始观察
    func beginObserver() {
        let notificationName = Notification.Name(rawValue: "DownloadImageNotification")
        
        NotificationCenter.default.observe(once: notificationName).done { notification in
            let userInfo = notification.userInfo as! [String: AnyObject]
            let value1 = userInfo["value1"] as! String
            let value2 = userInfo["value2"] as! Int
            
            print("\(self.name) 获取到通知,用户数据是[\(value1),\(value2)]")
            
            sleep(3)
            
            print("\(self.name) 执行完毕")
            
            //继续观察
            self.beginObserver()
        }
    }
}

(3)运行结果如下。可以看出,通知发送后,观察者执行是同步的(一个执行完毕后才执行另一个)。
评论

全部评论(0)

回到顶部