(六十九)使用block进行消息传递
在两个类之间进行消息传递,一般通过代理或者block进行,代理写起来较为麻烦,block较为简单,但是block需要特别注意内存泄漏问题,注意self和block之间要为弱引用,下面介绍使用block进行消息传递的方法。
先来复习一下block的结构:
返回类型 (^block名称)(参数1类型,参数2类型...)
下面以XMPP的用户登录为例来说明block消息传递方法。
网络操作在AppDelegate中进行,而登录界面视图控制器类中,由于登录按钮点击之后需要在授权完成时让网络操作类通知登录界面,因此在AppDelegate中定义一个block,并且把它作为登录方法的参数,在登录控制器点击了登录按钮时,必然会调用登录方法,因为登录方法有一个参数是block,因此可以通过这个block实现登录成功后的业务。而AppDelegate只需要在登录方法被调用时把block存起来,在授权成功后调用block,传递参数即可。
具体实现如下:
①在AppDelegate,也就是需要给另一个类传递消息的类内,定义一个block和相应的方法:
typedef enum{
XMPPResultTypeSuccess,
XMPPResultTypeFailure
}XMPPResultType;
typedef void (^XMPPResultBlock)(XMPPResultType type);
/**
* 用户登录
*/
- (void)xmppUserLogin:(XMPPResultBlock)resultBlock;
②在视图控制器中实现相应方法,传入一个block:
需要注意的是,因为在block中使用了self,会造成block对self的强引用,这个强引用会使得视图控制器在登录结束后无法销毁,从而造成内存泄漏,因此这里使用一个弱指针来调用控制器的方法。
AppDelegate *app = [UIApplication sharedApplication].delegate;
__weak typeof (self) selfVc = self; // 弱引用的控制器
[app xmppUserLogin:^(XMPPResultType type) {
[selfVc handleResult:type]; // 注意block引入了一个对控制器的强引用,无法释放当前控制器,因此应当弱引用
}];
③在AppDelegate中实现方法时保存传入的block:
@interface AppDelegate () <XMPPStreamDelegate>{
XMPPResultBlock _resultBlock;
}
- (void)xmppUserLogin:(XMPPResultBlock)resultBlock{
[self connectToHost];
_resultBlock = resultBlock;
}
④在授权成功时发送结构,由于block有一个枚举参数,因此可以传入值:
if (_resultBlock) {
_resultBlock(XMPPResultTypeSuccess);
}
由于_resultBlock保存的正是视图控制器传入的block,因此会在调用时实现视图控制器定义的block的内容。
(六十九)使用block进行消息传递的更多相关文章
- 第三百六十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索功能
第三百六十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索功能 Django实现搜索功能 1.在Django配置搜索结果页的路由映 ...
- “全栈2019”Java第六十九章:内部类访问外部类成员详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- OpenCV开发笔记(六十九):红胖子8分钟带你使用传统方法识别已知物体(图文并茂+浅显易懂+程序源码)
若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...
- 《手把手教你》系列技巧篇(六十九)-java+ selenium自动化测试 - 读取csv文件(详细教程)
1.简介 在实际测试中,我们不仅需要读取Excle,而且有时候还需要读取CSV类的文件.如何去读取CSV的文件,宏哥今天就讲解和分享一下,希望对你能够有所帮助.前面介绍了如何读取excel文件,本篇介 ...
- FastAPI(六十九)实战开发《在线课程学习系统》接口开发--修改密码
之前我们分享了FastAPI(六十八)实战开发<在线课程学习系统>接口开发--用户 个人信息接口开发.这次我们去分享实战开发<在线课程学习系统>接口开发--修改密码 我们梳理一 ...
- C#编程(六十九)----------DLR简介
DLR 一.近年来,在TIOBE公司每个月发布的编程语言排行榜中,C#总是能挤进前十名,而在最近十年来,C#总体上呈现上升的趋势.C#能取得这样的成绩,有很多因素,其中它在语言特性上的锐意进取让人印象 ...
- 第六十九篇、OC_录制语音和播放语音功能的实现
录制: 1.设置全局属性 NSURL *recordedFile;//存放路径 AVAudioPlayer *player;//播放 AVAudioRecorder *recorder;//录制 NS ...
- JBoss 系列六十九:CDI 基本概念
概述 如果说EJB,JPA是之前JEE(JEE5及JEE5之前)中里程碑式的规范,那么在JEE6,JEE7中CDI可以与之媲美,CDI(Contexts and Dependency Injectio ...
- 第六十九节,css入门基础
css入门基础 学习要点: 1.使用CSS 2.三种方式 3.层叠和继承 本章主要探讨HTML5中CSS (层叠样式表),它是用来对HTML文档外观的表现形式进行排版和格式化. 一 使用CSS CSS ...
随机推荐
- JS文件中获取contextPath的方法
function getContextPath() { var pathName = document.location.pathname; var index = pathName.su ...
- SpringSecurity 进行自定义Token校验
背景 Spring Security默认使用「用户名/密码」的方式进行登陆校验,并通过cookie的方式存留登陆信息.在一些定制化场景,比如希望单独使用token串进行部分页面的访问权限控制时,默认方 ...
- 利用Bioperl的SeqIO模块解析fastq文件
测序数据中经常会接触到fastq格式的文件,比如说拿到fastq格式的原始数据后希望查看测序碱基的质量并去除低质量碱基.一般而言大家都是用现有的工具,比如说fastqc这个Java写的小程序,确实很好 ...
- MySQL 字符串截取SUBSTRING()函数
MySQL 字符串截取相关函数: 1.从左开始截取字符串 left(str, length) 说明:left(被截取字段,截取长度) 例: select left(content,200) as ab ...
- PHP 序列化/反序列化的方法函数
我们在开发的过程中常常遇到需要把对象或者数组进行序列号存储,反序列化输出的情况.特别是当需要把数组存储到mysql数据库中时,我们时常需要将数组进行序列号操作. 序列化(串行化):是将变量转换为可保存 ...
- android自定义View之3D索引效果
效果图: 我的小霸王太卡了. 最近工作比较忙,今天搞了一下午才搞出来这个效果,这种效果有很多种实现方式,最常见的应该是用贝塞尔曲线实现的.今天我们来看另一种不同的实现方式,只需要用到 canvas.s ...
- intel-hadoop/HiBench流程分析----以贝叶斯算法为例
1.HiBench算法简介 Hibench 包含9个典型的hadoop负载(micro benchmarks,hdfs benchmarks,web search bench marks,machin ...
- APP中一种在Java层实现的简单守护进程方式
转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/52779986 守护进程是一个黑色 ...
- Mybatis源码分析之参数映射及处理ParameterHandler
ParameterHandler是用来设置参数规则的,当StatementHandler调用prepare方法之后,接下来就是调用它来进行设置参数. ParameterHandler接口: publi ...
- 高德地图车机版API演示程序
高德地图车机版API演示程序 做车载的应该和这个程序打交道打的比较多吧,这里是我今天写的一个实现了他的API的一个演示程序 首先我们来看下他的官网. http://lbs.amap.com/api/a ...