(六十九)使用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的内容。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-16 07:02:31

(六十九)使用block进行消息传递的相关文章

六十九、for循环、while循环、break跳出循环、continue结束本次循环、exit退出整

六十九.for循环.while循环.break跳出循环.continue结束本次循环.exit退出整个脚本 一.for循环 语法:for 变量名 in 条件; do -; done 案例1 # vim for1.sh #!/bin/bash sum=0 for i in `seq 1 100` do sum=$[$sum+$i]     //核心语句 echo $i done echo $sum //最后再echo $sum,不能在for循环里echo,不然每次的sum都打印出来了.让它每次都打

C#编程(六十九)----------DLR简介

DLR 一.近年来,在TIOBE公司每个月发布的编程语言排行榜中,C#总是能挤进前十名,而在最近十年来,C#总体上呈现上升的趋势.C#能取得这样的成绩,有很多因素,其中它在语言特性上的锐意进取让人印象深刻. C#4动态功能是Dynamic Language Runtime(动态语言运行时,DLR)的一部分.DLR是添加到CLR的一系列服务,它允许添加动态语言,如Ruby和Python,并使C#具备和这些动态语言相同的某些功能. 动态编程语言并非什么新鲜事物,早在面向对象编程语言成为主流之前,人们

一起talk C栗子吧(第一百六十九回:C语言实例--再谈内置宏)

各位看官们,大家好,上一回中咱们说的是C语言中的布尔–bool类型的例子,这一回咱们说的例子是:再谈内置宏 .闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,我们在第一百二十四回中介绍了C语言中的内置宏,当时介绍了常用的内置宏_LINE_和_FILE_.并且介绍了如何使用它们来输出它们所在位置的行号和所在的文件名.大家都知道,这两个内置宏经常被用来在文件中添加调试信息.因为我们写的程序难免会有错误,所以需要对程序进行调试.在文件中加入内置宏后,我们通过调试可以快速地找到错误发生在哪个

一个屌丝程序猿的人生(六十九)

"同学们,这次的项目演示已经结束了.对于这一次演示的结果,我非常满意.特别是最后的提问环节,大家都回答的非常出色.看的出来,这次同学们都是下了功夫的,这十分难得.为此,我请同学们举起双手,为你们的努力献上热烈的掌声." "啪啪啪......" 台下一阵雷鸣般的掌声响起,众人的眼中都充满了斗志. 看得出来,郑忠科再一次成功的给大家灌输了一管鸡血. 不过,就在掌声逐渐消失以后,郑忠科突然话锋一转说道:"好了.接下来,就到了今天最后一个环节了.那就是,宣布今天的

第六十九篇、OC_录制语音和播放语音功能的实现

录制: 1.设置全局属性 NSURL *recordedFile;//存放路径 AVAudioPlayer *player;//播放 AVAudioRecorder *recorder;//录制 NSString *recoderName;//文件名 2.设置存储路径 NSDateFormatter *formater = [[NSDateFormatter alloc] init]; [formater setDateFormat:@"yyyy-MM-dd-HH:mm:ss"]; N

第二百六十九节,Tornado框架-Session登录判断

Tornado框架-Session登录判断 Session需要结合cookie来实现 Session的理解 1.用户登录系统时,服务器端获取系统当前时间,进行nd5加密,得到加密后的密串 2.将密串作为一个字典的键,值为一个字典,也就是嵌套字典,键为密串的字典里保存用户信息 3.将这个密串当做cookie值写入浏览器 4.当用户访问时,判断值为密串的cookie是否存在,如果存在,获取cookie的值也就是密串,将这个密串在服务端的字典里查找是否存在,如果存在就可以拿到用户保存的各种信息,判断用

Android实战简易教程-第六十九枪(自定义控件实现雪花飘落效果)

现在APP要求越来越高了,不只是要求实现功能,颜值的要求也越来越高,下面我们通过自定义控件来实现雪花飘落的效果,可以作为界面背景哦. 1.自定义控件: package com.test.a; import java.util.Random; import android.content.Context; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.Can

(六十九)ViewPager的使用方法解析

一.ViewPager组件是用来显示左右滑动界面的控件.它的一般实现步骤是:1.在布局中加入ViewPager 2.加载要显示的页卡 3.设置适配器 二.通过使用ViewPager来实现APP的引导页面的例子,来大概知道ViewPager的使用方法 2.1 welcome_vp.xml文件 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http:

three.js 源码注释(六十九)extras/geometries/CircleGeometry.js

商域无疆 (http://blog.csdn.net/omni360/) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:商域无疆 -  本博客专注于 敏捷开发及移动和物联设备研究:数据可视化.GOLANG.Html5.WEBGL.THREE.JS,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 俺也是刚开始学,好多地儿肯定不对还请见谅. 以下代码是THREE.JS 源码文件中extras/geometries/CircleGeometry.js文件的注释. 更