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 ...
随机推荐
- rpc框架之 thrift 学习 2 - 基本概念
thrift的基本构架: 上图源自:http://jnb.ociweb.com/jnb/jnbJun2009.html 底层Underlying I/O以上的部分,都是由thrift编译器生成的代码, ...
- 浅谈设计模式--装饰者模式(Decorator Pattern)
挖了设计模式这个坑,得继续填上.继续设计模式之路.这次讨论的模式,是 装饰者模式(Decorator Pattern) 装饰者模式,有时也叫包装者(Wrapper),主要用于静态或动态地为一个特定的对 ...
- warning: #870-D: invalid multibyte character sequence
warning: #870-D: invalid multibyte character sequence2011-03-12 9:18warning: #870-D: invalid multiby ...
- int,long,unsigned的值范围
unsigned int 0-4294967295 int 2147483648-2147483647 unsigned long 0-4294967295long 2147483 ...
- QTableView 添加进度条
记录一下QTableView添加进度条 例子很小,仅供学习 使用QItemDelegate做的实现 有自动更新进度 要在.pro文件里添加 CONFIG += c++ ProgressBarDeleg ...
- Theano2.1.5-基础知识之打印出theano的图
来自:http://deeplearning.net/software/theano/tutorial/printing_drawing.html Printing/Drawing Theano gr ...
- EXCEL时间日期转换为常规字符显示
当我们做报表导入的时候,我们不得不思考这样一个问题,遇到的数据是时间格式的,而在EXCEL中,时间格式的单元格实际上是以1900年以后来计算的,例如,1900年是闰年(显然可以被4整除),那么1900 ...
- Mysql与Redis的同步实践
一.测试环境在Ubuntu kylin 14.04 64bit 已经安装Mysql.Redis.php.lib_mysqludf_json.so.Gearman. 点击这里查看测试数据库及表参考 本文 ...
- Servlet作业1-实现注册登录
1,注册功能 注册页面zhuce.html <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" &q ...
- android textview改变部分文字的颜色和string.xml中文字的替换(转)
转 :http://blog.csdn.net/ljz2009y/article/details/23878669 一:TextView组件改变部分文字的颜色: TextView textView ...