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 ...
随机推荐
- &12 二叉搜索树
#1,定义 二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的 ...
- scala + intellij idea 环境搭建及编译、打包
大数据生态圈中风头正旺的Spark项目完全是采用Scala语言开发的,不懂Scala的话,基本上就没法玩下去了.Scala与Java编译后的class均可以运行于JVM之上,就好象.NET中F#与C# ...
- scrapy 保存到 sqlite3
scrapy 爬取到结果后,将结果保存到 sqlite3,有两种方式 item Pipeline Feed Exporter 方式一 使用 item Pipeline 有三个步骤 文件 pipelin ...
- Theano2.1.3-基础知识之更多的例子
来自:http://deeplearning.net/software/theano/tutorial/examples.html More Examples 现在,是时候开始系统的熟悉theano的 ...
- pay-as-you-go
What is pay as you go? A pay as you go deal means you aren’t tied into a contract and can top up you ...
- 代码设计工具——PowerDesigner
详情请参考博客: http://www.blogjava.net/wangdetian168/archive/2011/04/07/347847.html
- C++_STL
容器概念讲解 vector deque
- 【BZOJ 1023】【SHOI 2008】cactus仙人掌图
良心的题解↓ http://z55250825.blog.163.com/blog/static/150230809201412793151890/ tarjan的时候如果是树边则做树形DP(遇到环就 ...
- 哈希 poj 1480
计算可能的数目 a3*x3^3+a4*x4^3+a5*x5^5=-(a1*x1^3+a2*x2^3); 列举右边的 结果存到数组 z[i] 和为i的右边等式的数目 如果和小于0 +2500000 ...
- 区间DP lightoj 1031
在此游戏中任意时刻的状态都是原始序列的一段子序列故: 定义d(i, j) : 表示原来序列的第i ~ j个元素组成的子序列,在双方都采取最优策略的情况下,先手得分的最大值. 状态转移时,需要枚举从左边 ...