一.回调方法总结:
可以参考:https://www.jianshu.com/p/3ff91ef196d1
常用有三种:1.Delegate 和 DataSource 2.Notification 3.Blocks
二.Block
这里重点介绍Block这种用法:
在OC里面是Block,在swift里面叫closure,用法是类似的.
首先OC block简单参考如下:
https://www.jianshu.com/p/7d32ed28292f
这里面实现的是A跳转到B,B处理完,回调数据到A
但是这里面操作的时候有思维上的坑,首先是报野指针的错,然后通过判断是否为空发现,B中的block一直是空的,但是搞不懂为甚是空的.
然后我换了种方法,既然B那里是空的,那我就在A那里传一个block过去,操作如下:
参考:https://www.cnblogs.com/XYQ-208910/p/6257268.html
B.h:
@interface PingInfo : NSObject - (void) addCallBack:(void(^)(NSString *)) callBackBlock ;
B.m:
typedef void(^CallBackBlock) (NSString *); @interface PingInfo() @end @implementation PingInfo{ CallBackBlock _callBackBlock; } - (void) addCallBack:(void(^)(NSString *)) callBackBlock { _callBackBlock = callBackBlock; if(_callBackBlock){ _callBackBlock(@"test-=-=-=-=-="); } }
A.swift:
let pingInfo = PingInfo.init() pingInfo.addCallBack( { string in print("callback message: \(string)") } )
Perfect,没有任何问题.可以获得返回数据了.然后我就疑惑,是不是
pingInfo.callBackBlock = { string in print("callback message: \(string)") }
这行代码OC不会识别呢,是不是swift和OC之间的处理问题呢,然后我又换了纯swift来试一次回调,参考操作如下:
https://www.jianshu.com/p/20407ee99346
发现B.swift的block还是空的.然后我对照了一下我的代码:
A.swift
pingInfo.passBlock() //错误 pingInfo.callBackBlock = { string in print("callback message: \(string)") }
B.m:
- (void)passBlock{ if(_callBackBlock == NULL){ NSLog(@"callBackBlock null "); } if(_callBackBlock){ _callBackBlock(@"test-=-=-=-=-="); } }
终于发现了我犯了一个愚蠢的错误.因为网上的参考代码并没有调用B中的方法来实现回调,而是直接跳转处理后回调,一般想法都认为block在B中声明,那么应该是在B中赋值的.其实问题就出现在这里,block应该是在A中赋值的,B中调用的,流程如下:
OC(B)类里面声明--->swift controller(A)里面赋值----->OC类(B)里面调用------>swift controller(A)获得返回值
因此,我之前的做法直接使用了B类中的block调用,当然是空的,因为并没有执行赋值:
pingInfo.callBackBlock = { string in print("callback message: \(string)") }
所以正确的是:
pingInfo.callBackBlock = { string in print("callback message: \(string)") } pingInfo.passBlock() //正确
一般思维惯性都是同一个类里面声明和赋值,但是block好特别,同一个类里面只是声明和调用,打一个比喻,好像买基金,基金的种类和涨跌就是block的声明和调用,但是如果你不买,就是不对一个block赋值(买多少,才知道有多少份额),这只基金是和你无关的,同理,基金涨跌了,对你来说是异步的,结果根据你的赋值(份额)回调(显示)给你就是了.
综上,block有两种操作方式,要不就通过方法来传给B来使用,要不就直接赋值,其实本质都是一样的,和上面的基金例子一样,是否通过代理来买而已.
相关推荐
IOS block回调代码实例Demo IOS block 回调 Demo 块
一直为block回调困惑,写个小demo熟悉熟悉
一个block回调的例子
先跟着我实现最简单的 Block 回调传参的使用,如果你能举一反三,基本上可以满足了 OC 中的开发需求。已经实现的同学可以跳到下一节。 首先解释一下我们例子要实现什么功能(其实是烂大街又最形象的例子): 有两个...
Block 类回调
delegate和block是iOS上常用于实现回调的两种机制,Demo将两者进行了简单的归类与对比。
block的回调测试代码,主要是block回调的时候传参问题
菜单,滚动视图,UIScrollview,选择菜单
一句代码实现键盘弹出消失监控,含block回调处理逻辑
使用系统地图进行定位及反编码(二次封装类,便于开发) SYCLLocation:https://github.com/potato512/SYCLLocation
IOS二维码扫描可自定义页面(快速集成、支持Block回调处理),只需要把LBXScan文件夹拖入工程内即可,具体使用方式看Demo代码。
IOS 使用Block二次封装AFNetworking 3.0详解 现在我们网络请求大都用第三方工具—–AFNetworking; 其中,AFNetworking 3.0 是对 NSURLSession 进行的封装,简化了很多步骤,但是在现实开发中,我们可以将...
这在使用dispatch并发(Operation中也有BlockOperation)和completion异步回调等处都广泛应用。 Block是苹果官方特别推荐使用的数据类型,使用场景比较广泛 动画 多线程 集合遍历 网络请求回调 Block的作用 ...
对UIAlertView进行简单的扩展封装,实用block块的方式回调用户的点击操作。定义了三种样式:普通提示框、不带取消按钮的提示框、带输入框的提示框。注释详尽,方便大家学习。
用来实现匿名函数的特性,block是一种特殊的数据类型,其可以正常定义变量、作为参数、作为返回值,特殊地,block还可以保存一段代码,在需要的时候调用,目前block已经广泛应用于iOS开发中,常用于GCD、动画、排序及各类回...
iOS开发过程中常用到block语句,但是一直很迷惑,就简单研究了一下,写个Demo给初学者使用
Block 对象是 C 级别的语法和运行时特性。它们和标准 C 函数很类似,但是...Blocks 作为回调特别有用,因为 block 携带了进行回调所需 要的执行代码和执行过程中需要的数据。 该资源来自cc论坛,请保留原作者的权利。
对iOS中Block的介绍
通过Block实现TableViewCell上button的点击事件.