函数的回调

回调函数 关于回调函数,大白话总结!不一定全,但是绝对易懂。

第1个问题:什么是回调函数? 回调函数,本质上也是个函数(搁置函数和方法的争议,就当这二者是

一回事)。由“声明”、“实现”、“调用”三部分组成。

在上面的例子中,我可以看出,函数amount(其实是Block),的声明 和调用在A类中,而实现部分在B类中。也就是说,B类实现了amount 函数,但并没有权限调用,最终还是 由A类触发调用。我们称这样的机 制为“回调”。意思是“虽然函数的实现写在B类中,但是真正的调用还是 得由A类来完成。”正常函数“函数声明、实现均在一个类中完成。”

一句大白话理解“回调”的概念:“函数的实现部分虽然不在老家(A类), 但是最终的调用还是由老家人完成”,这样的函数就叫做回调函数。“老 家人调用你,就叫回调,因为你本来就属于老家。

用《无间道》理解“回调函数”概念:

香港警务处(类):

招聘了一名警察张三(声明函数),并培养、训练他(实现函数)。

招聘了一名警察陈仁贵(声明函数),但并没有培养他,而是被送进了 三合会。但有任务的时候,警务处会调用陈仁贵(回调函数)。

廉政总署(类):使用警务处的张三(普通调用)。 三合会(类):培养、训练陈仁贵(实现函数)。 第二个问题:什么情况下使用回调函数? 假设有A、B两个类。

(1)A类有多种形态,要在B类中实现回调函数。如假设A类是网络请 求开源类ASIHttpRequest,它可能请求成功,也可能请求失败。这个时 候,B类就要针对以上两个情况,作不同的处理。

( 2 )A 类 的 形 态 由 B 类 决 定 时 ,要 在 B 类 中 实 现 回 调 函 数 。如 U I T a b l e V i e w 类就会提供很多回调函数(iOS专业术语称“委托”方法)

(3)A类需要向B类传递数据时,可以在B类中实现回调函数(A类一般 是数据层比较耗时的操作类)。 如举的那个发工资的例子。在实际编 程中,这样的机制有个好处就是可以提升用户的操作体验。比如用户从 X页面跳转到Y页面,需要向网络请求数据,而且比较耗 时,那我们怎 么办?有三种方案:第一种就是在X页面展示一个旋转指示器,当收到 网络传回的数据时,在展现Y页面。第二种就是使用回调函数。用户从X 页面直 接跳转到Y页面,Y页面需要到数据让数据层去执行,当收到数 据时,再在Y页面展现。第三种就是在Y页面中开启多线程。让一个子线 程专门到后台去取数据。综 合来说,第二种更加简介易懂,而且代码 紧凑。

第三个问题:使用回调函数有什么好处?

(1)可以让实现方,根据回调方的多种形态进行不同的处理和操作。 (ASIHttpRequest)

(2)可以让实现方,根据自己的需要定制回调方的不同形态。 (UITableView)

(3)可以将耗时的操作隐藏在回调方,不影响实现方其它信息的展示。 (4)让代码的逻辑更加集中,更加易读。

什么是回调函数?——就是由声明函数的类来调用的函 数叫做回调函数。普通函数可以让任何类调用。

“回调”的主语是谁?——声明“回调函数”的那个类。

Block、委托、通知、回调函数,它们虽然名字不一样, 但是原理都一样,都是“回调机制”的思想的具体实现!

现在明白Block的原理了吗?

参考:

block一点也不神秘————如何利用block进行回调 理解“回调”概念
Blocks Programming Topics

Block中的一个重要特性:内存释放。凡在block中使用的变量,block
都将进行自动的释放。所以,如果使用系统全局变量作为参数传入block,
一定在传入之前retain一次,才能保证这个变量不被release。如下:

-(void)requestSearchResult
{

[word retain]; //block中所有变量均将被释放,字符型除外

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE _PRIORITY_DEFAULT, 0), ^{

SQSearchAction *action_search = [[SQSearchAction alloc]initWithDelegate:self];

[action_search requestSearchResultByWord:word type:type pageNo:pageNo flag:flag];

[action_search release]; dispatch_async(dispatch_get_main_queue(), ^{

//更新UI操作 });

}); }

时间: 2024-11-16 21:18:44

函数的回调的相关文章

Java/Android中的函数调用&回调函数&自定义回调函数

在做Android自定义控件时遇到要自定义回调函数的问题,想想自己还暂时没有那么精深的技术,赶紧返过头回来再重新研究Java中回调函数的问题.然而不幸的是,网上太多杂乱的帖子和博客都是转来转去,而且都是那一篇"C中的回调函数.....指针.....java....",一点看不出来是自己的思路,估计都是哪哪哪抄来的!(呵呵,要么就是吐槽对了,要么就是我水平太烂读不懂还妄加评论)还有一些很不错的文章,我会在最后参考中加上链接,大家可以看看. 那么来开始我们的正题--什么是回调函数? 我们一

Node.js学习笔记(3)——关于回调函数和函数的回调

说明:本人是node.js的初学者,尝试向别人解释这是怎么回事是自我学习的一个好方法.如果你发现有些地方并不是那么正确,欢迎提出来让我知道以便修正,共同进步,谢过^_^.       欢迎交流,本人微博:http://weibo.com/bitsea  很多地方都涉及到函数的回调,在这里简单说一下什么是函数的回调. 回调函数就是回来再调用的函数. 基于js的单线程执行代码的风格,回调是必须的选择.也可以说是一种不得已而为之的选择吧,回调无疑增加了代码的复杂性,使其变得难读.难理解,难维护.但是,

Javascript中的回调函数和匿名函数的回调

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> <script type="text/javascript"> /* * 匿名函数自调的意义: 1.营造了一个封闭的空间 2.防止变量冲突 3.有选择性的对外开发(第三方框架都是对js这样封装的) */ //===

C++中类成员函数作为回调函数

注:与tr1::function对象结合使用,能获得更好的效果,详情见http://blog.csdn.net/this_capslock/article/details/38564719 回调函数是基于C编程的Windows SDK的技术,不是针对C++的,程序员可以将一个C函数直接作为回调函数,但是如果试图直接使用C++的成员函数作为回调函数将发生错误,甚至编译就不能通过. 普通的C++成员函数都隐含了一个传递函数作为参数,亦即“this”指针,C++通过传递一个指向自身的指针给其成员函数从

c语言(函数指针,回调函数)

//  main.m //  1-28随堂笔记 //讲师: 小辉 //笔者: 王学文 //  Created by lanouhn on 15/1/28. //  Copyright (c) 2015年 lanouhn. All rights reserved. // 函数指针, 回调函数 #import <Foundation/Foundation.h> struct student { char name[20]; float score; int age; }; typedef stru

15) .实现可变参数的(成员/非成员)模板函数的回调,消除类似代码

完整的源代码及用法测试代码可以在我的资源中去下载. C++语法不支持模板函数/模板成员函数作为回调函数,同时把运行期代码向编译期代码转换也只有switch...case或者if..else能够实现. 如果case比较多的时候,代码非常臃肿,而且类似的大片代码中,往往只有一个参数的不同,其它都是相同的.这对于用户来说,都是一个大量的重复性的hard-code性的负担,而且也容易导致出错. 本库采用了封装,可以把运行性的switch...case/if..else分支选择转换为编译期的代码,支持模板

钩子函数和回调函数的区别

一般认为,钩子函数就是回调函数的一种,其实还是有差异的,差异地方就是:触发的时机不同. 先说钩子函数: 钩子(Hook)概念源于Windows的消息处理机制,通过设置钩子,应用程序对所有消息事件进行拦截,然后执行钩子函数. let btn = document.getElementById("btn"); btn.onclick = () => { console.log("i'm a hook"); } 上面的例子,在按钮点击时候立即执行钩子函数.而看下面的

精读JavaScript模式(五),函数的回调、闭包与重写模式

一.前言 今天地铁上,看到很多拖着行李箱的路人,想回家了. 在上篇博客结尾,记录到了函数的几种创建方式,简单说了下创建差异,以及不同浏览器对于name属性的支持,这篇博客将从第四章函数的回调模式说起.我想了想,还是把一篇博客的知识点控制在五个以内,太长了我自己都懒得看,而且显得特别混杂.标题还是简要说下介绍了哪些知识,也方便自己以后查阅,那么开始. 二.函数的回调模式 1.什么是函数回调模式? 当调用函数时,我们可以将函数作为参数传入到需要调用的函数中,例如我们为函数A传入一个函数B,当函数A执

普通函数与回调函数的区别

普通函数与回调函数的区别:对普通函数的调用:调用程序发出对普通函数的调用后,程序执行立即转向被调用函数执行,直到被调用函数执行完毕后,再返回调用程序继续执行.从发出调用的程序的角度看,这个过程为“调用-->等待被调用函数执行完毕-->继续执行” 对回调函数调用:调用程序发出对回调函数的调用后,不等函数执行完毕,立即返回并继续执行.这样,调用程序执和被调用函数同时在执行.当被调函数执行完毕后,被调函数会反过来调用某个事先指定函数,以通知调用程序:函数调用结束.这个过程称为回调(Callback)