一、有关回调

我们知道,执行函数的时候,一般都有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的更多相关文章

  1. iOS 键盘添加完成按钮,delegate和block回调

    这个是一个比较初级一点的文章,新人可以看看.当然实现这个需求的时候自己也有一点收获,记下来吧. 前两天产品要求在工程的所有数字键盘弹出时,上面带一个小帽子,上面安装一个“完成”按钮,这个完成按钮也没有 ...

  2. iOS页面间传值的方式(Delegate/NSNotification/Block/NSUserDefault/单例)

    iOS页面间传值实现方法:1.通过设置属性,实现页面间传值:2.委托delegate方式:3.通知notification方式:4.block方式:5.UserDefault或者文件方式:6.单例模式 ...

  3. iOS页面间传值的方式(NSUserDefault/Delegate/NSNotification/Block/单例)

    iOS页面间传值的方式(NSUserDefault/Delegate/NSNotification/Block/单例) 实现了以下iOS页面间传值:1.委托delegate方式:2.通知notific ...

  4. 【转】iOS页面间传值的方式(Delegate/NSNotification/Block/NSUserDefault/单例)-- 不错

    原文网址:http://www.cnblogs.com/JuneWang/p/3850859.html iOS页面间传值的方式(NSUserDefault/Delegate/NSNotificatio ...

  5. iOS页面间传值的方式 (Delegate/NSNotification/Block/NSUserDefault/单例)

    iOS页面间传值的方式(Delegate/NSNotification/Block/NSUserDefault/单例)   iOS页面间传值的方式(NSUserDefault/Delegate/NSN ...

  6. iOS页面间传值的五种方式总结(Delegate/NSNotification/Block/NSUserDefault/单例)

    iOS页面间传值的方式(Delegate/NSNotification/Block/NSUserDefault/单例) iOS页面间传值的方式(NSUserDefault/Delegate/NSNot ...

  7. block学习二:使用Block替代回调

    使用Block替代回调,分为三步进行:

  8. iOS 传值 委托(delegate)和block 对比

     技术交流新QQ群:414971585 这篇文章建议和前一篇一起看, 另外先弄清楚IOS的block是神马东东. 委托和block是IOS上实现回调的两种机制.Block基本可以代替委托的功能,而且实 ...

  9. [Objective-C] Block实现回调和简单的学习思考

    初识Block的时候,总觉得其很可怕,因为看不懂其运行原理,所以用起来总是觉得不安全.关于Block的语法,等我把手里的资料全部看完,整理好再发出来.这次先看看用Block怎么实现回调. 新博客:wo ...

随机推荐

  1. lecture5-对象识别与卷积神经网络

    Hinton第五课 突然不知道object recognition 该翻译成对象识别好,还是目标识别好,还是物体识别好,但是鉴于范围性,还是翻译成对象识别吧.这一课附带了两个论文<Convolu ...

  2. Theano2.1.18-基础知识之theano的扩展

    来自:http://deeplearning.net/software/theano/tutorial/extending_theano.html Extending Theano 该教程覆盖了如何使 ...

  3. 基于DDD的.NET开发框架 - ABP的Entity设计思想

    返回ABP系列 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WEB应 ...

  4. 用 Linux自带的logrotate 来管理日志

    大家可能都有管理日志的需要,比如定时压缩日志,或者当日志超过一定大小时就自动分裂成两个文件等.最近就接到这样一个小任务.我们的程序用的是C语言,用log4cpp的library来实现日志记录.但是问题 ...

  5. Tensorflow学习笔记3:TensorBoard可视化学习

    TensorBoard简介 Tensorflow发布包中提供了TensorBoard,用于展示Tensorflow任务在计算过程中的Graph.定量指标图以及附加数据.大致的效果如下所示, Tenso ...

  6. 20160303 - 升级 Windows 10 版本 1511 后,文件夹默认打开方式为 cmd 的修复

    问题描述:升级 Windows 10 版本 1511 (OS 内部版本 10586.122)后,文件夹的默认打开方式变成了cmd.双击任何一个文件夹,显示相关的提示错误信息如下: [Window Ti ...

  7. js前端分页

    转载:http://www.cnblogs.com/lyzg/p/5791011.html http://www.cnblogs.com/m-m-g-y0416/p/5601903.html

  8. IOS自学

    初识IOS 开发工具:xcode , 第一步学习c 打开xcode 新建一个object #include<stdio.h>//引入一个库,支持pringf输出功能 /* this is ...

  9. 1018MYSQL数据迁移到SQLSERVER

    -- 第一步利用MYSQL将数据结果的脚本迁移出来-- 第二步利用POWERDESGINER的反向功能,将脚本生成为物理模型 FILE-REVERSE DATEBASE -- 第三步将物理模型生成SQ ...

  10. ceph calamari 监控系统安装 on ubuntu 14.04

    在 ubuntu 14.04 上安装ceph calamari时,遇到calamari web界面中node server可以正常添加,但cluster 集群无法显示的问题. 经过定位,是因为salt ...