Swift 用Delegate和Block实现回调的Demo
一、有关回调
我们知道,执行函数的时候,一般都有return作为返回参数了,那有return了为什么还要回调呢?
回调是为了实现异步的返回,在某些特殊的情况下,比如你执行的函数是一个长时间运行的函数,并不能直接返回给你结果,为了不影响源程序其他步骤的执行,你得继续执行下去,等那边产生结果了再“主动告诉你”结果是什么。
其原理不外乎:A调用B中函数,传递参数和自身指针,B执行完成再通过传递过来的指针重新调用A中函数。
在iOS开发中,实现回调的方式有:Delegate和Block。前者用变量指针实现,后者用函数指针实现。
假如我现在有一个processData的类用来处理数据,处理完之后回调给主要的Class。
二、Swift中实现回调
1.代理模式:利用protocol+引用变量
processData.swift
//
// ProcessData.swift import 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.swift import 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.swift import UIKit class 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.swift import UIKit class 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.swift import UIKit class ProcessData: NSObject{
//定义block
typealias fucBlock = (backMsg :String) ->() func processWithBlock(cmdStr:String?,blockProperty:fucBlock){
blockProperty(backMsg :"backMsg---by block inside func")
}
}
ViewController.swift
//
// ViewController.swift import UIKit class 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:https://github.com/rayshen/SwiftClosure
oc:https://github.com/rayshen/callbackDemo
Swift 用Delegate和Block实现回调的Demo的更多相关文章
- iOS 键盘添加完成按钮,delegate和block回调
这个是一个比较初级一点的文章,新人可以看看.当然实现这个需求的时候自己也有一点收获,记下来吧. 前两天产品要求在工程的所有数字键盘弹出时,上面带一个小帽子,上面安装一个“完成”按钮,这个完成按钮也没有 ...
- iOS页面间传值的方式(Delegate/NSNotification/Block/NSUserDefault/单例)
iOS页面间传值实现方法:1.通过设置属性,实现页面间传值:2.委托delegate方式:3.通知notification方式:4.block方式:5.UserDefault或者文件方式:6.单例模式 ...
- iOS页面间传值的方式(NSUserDefault/Delegate/NSNotification/Block/单例)
iOS页面间传值的方式(NSUserDefault/Delegate/NSNotification/Block/单例) 实现了以下iOS页面间传值:1.委托delegate方式:2.通知notific ...
- 【转】iOS页面间传值的方式(Delegate/NSNotification/Block/NSUserDefault/单例)-- 不错
原文网址:http://www.cnblogs.com/JuneWang/p/3850859.html iOS页面间传值的方式(NSUserDefault/Delegate/NSNotificatio ...
- iOS页面间传值的方式 (Delegate/NSNotification/Block/NSUserDefault/单例)
iOS页面间传值的方式(Delegate/NSNotification/Block/NSUserDefault/单例) iOS页面间传值的方式(NSUserDefault/Delegate/NSN ...
- iOS页面间传值的五种方式总结(Delegate/NSNotification/Block/NSUserDefault/单例)
iOS页面间传值的方式(Delegate/NSNotification/Block/NSUserDefault/单例) iOS页面间传值的方式(NSUserDefault/Delegate/NSNot ...
- block学习二:使用Block替代回调
使用Block替代回调,分为三步进行:
- iOS 传值 委托(delegate)和block 对比
技术交流新QQ群:414971585 这篇文章建议和前一篇一起看, 另外先弄清楚IOS的block是神马东东. 委托和block是IOS上实现回调的两种机制.Block基本可以代替委托的功能,而且实 ...
- [Objective-C] Block实现回调和简单的学习思考
初识Block的时候,总觉得其很可怕,因为看不懂其运行原理,所以用起来总是觉得不安全.关于Block的语法,等我把手里的资料全部看完,整理好再发出来.这次先看看用Block怎么实现回调. 新博客:wo ...
随机推荐
- 使Eclipse符合Java编程规范
编程规范是很重要的东西,能让团队的代码易于阅读和维护,也便于日后的功能扩展. 工欲善其事必先利其器!作为一个Java程序员,与Eclipse打交道可能是一辈子的事情.将Eclipse设置为符合公司编程 ...
- 学习C++.Primer.Plus 4 复合类型
本章介绍的有复合类型有: 数组. 字符串. 结构. 共用体. 指针 数组: 声明数组时数组长度必须为常量(或const). 只有初始化时可以用“=”,其它时候均不可以给数组直接赋值,除了赋值的元素以外 ...
- canvas drag 实现拖拽拼图小游戏
博主一直心心念念想做一个小游戏- 前端时间终于做了一个小游戏,直到现在才来总结,哈哈- 以后要勤奋点更新博客! 实现原理 1.如何切图? 用之前的方法就是使用photoshop将图片切成相应大小的图 ...
- GWT-Dev-Plugin(即google web toolkit developer plugin)for Chrome的安装方法
如果你想要在Chrome中进行GWT调试,需要安装“gwt developer plugin for chrome”,但是普通安装模式下,会提示: This application is not su ...
- css 图片的无缝滚动
转载:http://blog.sina.com.cn/s/blog_6387e82401013kx8.html js的图片的横向或者竖向的无缝滚动图片. ttp://zx.bjmylike.com/ ...
- 转一篇Unity的相机动画控制
最近真是忙,连研究细看的时间都没有了,原帖地址:https://alastaira.wordpress.com/2013/11/08/smooth-unity-camera-transitions-w ...
- 关于最近折腾的ubuntu12.10
win7旗舰正版up1 UltraISO + ubuntu-12.10-desktop-i386.iso + 4GKingston = 启动U盘 USB HDD 启动 进入ubuntu桌面,安装,磁盘 ...
- strut2的拦截器之对request和session的封装
本文主要内容是对 implements Interceptor 这种方式的探索 前提是需要了解:责任链模式 对下面这句代码的理解: Map<String, Object> session ...
- 通过ADO方式连接数据库
首先你正确安装了MySQL的数据库驱动程序(mysql-connector-odbc-5.1.6-win32.msi )或者64位的 本地连接: 1.在桌面上新建一个空的文本文件mysql.txt,重 ...
- Java--剑指offer(7)
31.求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了.AC ...