swift5学习之旅之代理通知block的使用

swift5学习之旅----代理通知block的使用

  • 工程文件(全是button类型的调用)

Github还没上传,先用着Dropbox(可能要),看完有收获的感谢点个赞,如果翻不了墙要代码可以私聊我
https://www.dropbox.com/sh/wbo7lwpphi8ibn9/AAAWxUOj0PRKDlTNfpPz_A11a?dl=0
dropbox代理通知block的使用
swift5学习之旅之代理通知block的使用_第1张图片

在这里插入图片描述

  • Protocol(协议)的作用:

一、定义一套公用的接口(Public)
@required:必须实现的方法
在这里插入代码片@optional:可选实现的方法(可以全部都不实现)

// Swift中如何定义协议: 必须遵守NSObjectProtocol
protocol TextViewControllerDelegate: NSObjectProtocol{
     
    // 点击delegate按钮回调
    func delegateBtnWillClick(message : String)
}

委托代理(Delegate)传值:

它本身是一个设计模式,它的意思是委托别人去做某事。

比如:两个类之间的传值,类A调用类B的方法,类B在执行过程中遇到问题通知类A,这时候我们需要用到代理(Delegate)。
(对象).delegate=self的意思就是对象的任务交给self去做

//定义一个属性保存代理,一定要加weak,避免循环引用
    weak var delegate: TextViewControllerDelegate?

代理: 1,“一对一”,对同一个协议,一个对象只能设置一个代理delegate,所以单例对象就不能用代理;
2,代理更注重过程信息的传输:比如发起一个网络请求,可能想要知道此时请求是否已经开始、是否收到了数据、数据是否已经接受完成、数据接收失败 (will, now,did)

//MARK: - 按钮点击方法,跳转界面
    @objc func pushBtnClick()
    {
     
        print("delegate")
        //设置此控制器为代理
        text.delegate = self
        self.navigationController?.pushViewController(text, animated: true)
    }

//MARK: - 代理方法
    func delegateBtnWillClick(message: String) {
     
        print(message)
    }
}
    //MARK: - 点击代理传值按钮
    @objc func delegateBtnClick()
    {
     
        print("代理传值按钮被点击")
        let str = "代理传值按钮被点击,把上个界面的值传了过来"
        delegate?.delegateBtnWillClick(message: str)
        self.navigationController?.popViewController(animated: true)
    }

在这里插入图片描述
1:写法更简练,不需要写protocol、函数等等
2,block注重结果的传输:比如对于一个事件,只想知道成功或者失败,并不需要知道进行了多少或者额外的一些信息
3,block需要注意防止循环引用
4,使用 block 的代码通常会在同一个地方

//内置类型为block的btnclick
typealias blockBtnClickSendValue = (_ message: String)->Void

 @objc func blockBtnClick()
    {
     
        print("闭包传值按钮被点击")
        if block != nil
        {
     
            block!("闭包传值按钮被点击,把上个界面的值传了过来")
        }
        self.navigationController?.popViewController(animated: true)
    }

textVC.myblock =  {
     (message:String) -> Void in
            
            print("\(message)")
        }

优先使用 block。而有两个情况可以考虑 delegate。
有多个相关方法。假如每个方法都设置一个 block, 这样会更麻烦。而 delegate 让多个方法分成一组,只需要设置一次,就可以多次回调。当多于 3 个方法时就应该优先采用 delegate。
在 swift 中,利用 enum, 多个方法也可以合并成一个 block 接口。
delegate 的方法是分离开的,并不会引用上下文,因此会更安全些。

在这里插入图片描述

通知的使用特点:一对多传值,控制器与控制器之间可以没有关联
delegate的形式只能是一对一,不能实现一对多。
设置rawvalue、Notification.name

let notificationBtnWillClick = "notificationBtnWillClick"

发送通知,如果通知中需要传值的话,在发出的通知中,加入userinfo,格式为字典.

 let dict = ["action":"通知传值按钮被点击,把上个界面的值传了过来"]
        NotificationCenter.default.post(name: NSNotification.Name(notificationBtnWillClick), object: self, userInfo: dict)

	监听通知(接收通知)
//监听通知
        NotificationCenter.default.addObserver(self, selector: #selector(receiveNotification(_ :)), name: NSNotification.Name(rawValue: notificationBtnWillClick), object: nil)

移除通知

//MARK: - 注销通知,deinit相当于OC中的dealloc方法
    deinit
    {
     
        NotificationCenter.default.removeObserver(self)
    }

A和B是两个不相干的关系,A不知道B,B也不知道A,那么这时候如果通过delegate就没办法做到,会相对复杂。所以可以通过NSNotifcation去做一些消息传递。

类似于键盘弹出事件
UNUserNotificationCenter(本地通知头部弹窗)

你可能感兴趣的:(iOS,Swift,ios,swift,xcode)