博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Swift 用Delegate和Block实现回调的Demo
阅读量:4709 次
发布时间:2019-06-10

本文共 3408 字,大约阅读时间需要 11 分钟。

一、有关回调

我们知道,执行函数的时候,一般都有return作为返回参数了,那有return了为什么还要回调呢?

回调是为了实现异步的返回,在某些特殊的情况下,比如你执行的函数是一个长时间运行的函数,并不能直接返回给你结果,为了不影响源程序其他步骤的执行,你得继续执行下去,等那边产生结果了再“主动告诉你”结果是什么。

其原理不外乎:A调用B中函数,传递参数和自身指针,B执行完成再通过传递过来的指针重新调用A中函数。

在iOS开发中,实现回调的方式有:Delegate和Block。前者用变量指针实现,后者用函数指针实现。

假如我现在有一个processData的类用来处理数据,处理完之后回调给主要的Class。

 

二、Swift中实现回调

1.代理模式:利用protocol+引用变量

processData.swift

////  ProcessData.swiftimport UIKit//定义协议protocol callBackDelegate {    func callbackDelegatefuc(backMsg:String)}class ProcessData: NSObject{    //定义一个符合改协议的代理对象    var delegate:callBackDelegate?    func processMethod(cmdStr:String?){        if((delegate) != nil){            delegate?.callbackDelegatefuc("backMsg---by delegate")        }    }}

ViewController.swift

////  ViewController.swiftimport UIKit//继承该协议class ViewController: UIViewController,callBackDelegate{        override func viewDidLoad() {        super.viewDidLoad()        let process=ProcessData()        //把process的delegate变量指针指向自己,那样process就能调用自己类里的函数了        process.delegate=self        //执行函数        process.processMethod("startProcess")    }    override func didReceiveMemoryWarning() {        super.didReceiveMemoryWarning()    }        //delegate回调    func callbackDelegatefuc(backMsg:String){        print(backMsg)    }}

 

2.利用闭包实现:

闭包在Objective-C中被称为Block,在Swift中被成为Closure(在Java中称为Lambda)

   2.1利用闭包变量实现回调

processData.swift

////  ProcessData.swiftimport UIKitclass ProcessData: NSObject{    //定义block    typealias fucBlock = (backMsg :String) ->()    //创建block变量    var blockproerty:fucBlock!        func processMethod(cmdStr:String?){        if let _ = blockproerty{            blockproerty(backMsg: "backMsg---by block property")        }    }}

ViewController.swift

////  ViewController.swiftimport UIKitclass ViewController: UIViewController{        override func viewDidLoad() {        super.viewDidLoad()        let process=ProcessData()                //block回调        process.blockproerty={ (backMsg) in            print(backMsg)        }                //执行函数        process.processMethod("processStart")    }    override func didReceiveMemoryWarning() {        super.didReceiveMemoryWarning()    }}

  2.2 把闭包写入函数作参数实现快速回调,可见这是一种代码最为简洁的方案

processData.swift

////  ProcessData.swiftimport UIKitclass ProcessData: NSObject{    //定义block    typealias fucBlock = (backMsg :String) ->()    func processWithBlock(cmdStr:String?,blockProperty:fucBlock){        blockProperty(backMsg :"backMsg---by block inside func")    }}

ViewController.swift

////  ViewController.swiftimport UIKitclass ViewController: UIViewController{        override func viewDidLoad() {        super.viewDidLoad()        let process=ProcessData()        //函数内回调        process.processWithBlock("bbb") { (backMsg) in            print(backMsg)        }    }    override func didReceiveMemoryWarning() {        super.didReceiveMemoryWarning()    }}

 

PS:如果Block带返回值的情况下,Block是这样定义和调用的

//定义block    typealias fucBlock = (backMsg :String) ->(String)

 

//函数内回调        process.processWithBlock("bbb") { (backMsg) ->(String) in            print(backMsg)            return "get msg"        } 

 

 2.3.刚使用的typealias把block给定义给一个变量了,现在直接代替进去就可以了,并且我给函数再加个String类型返回值。。

processData.swift

func processWithBlock(cmdStr:String?,blockProperty:(backMsg :String) ->())->(String){        blockProperty(backMsg :"backMsg---by block inside func")        return ""    }

 

 

 

swift:

oc:

 

转载于:https://www.cnblogs.com/rayshen/p/5038734.html

你可能感兴趣的文章
python:open/文件操作
查看>>
流程控制 Day06
查看>>
Linux下安装Tomcat
查看>>
windows live writer 2012 0x80070643
查看>>
tomcat 和MySQL的安装
查看>>
git常用操作
查看>>
京东SSO单点登陆实现分析
查看>>
u-boot启动第一阶段
查看>>
MySQL批量SQL插入性能优化
查看>>
定义列属性:null,default,PK,auto_increment
查看>>
用户画像展示
查看>>
C#中StreamReader读取中文出现乱码
查看>>
使用BufferedReader的时候出现的问题
查看>>
批处理文件中的路径问题
查看>>
hibernate出现No row with the given identifier exists问题
查看>>
为什么wait()和notify()属于Object类
查看>>
配置NRPE的通讯
查看>>
匹配两个空格之间的字符。。。
查看>>
CSS 文字溢出 变成省略号 ...
查看>>
Spring事务
查看>>