技术交流新QQ群:414971585

这篇文章建议和前一篇一起看, 另外先弄清楚IOS的block是神马东东。

委托和block是IOS上实现回调的两种机制。Block基本可以代替委托的功能,而且实现起来比较简洁,比较推荐能用block的地方不要用委托。

本篇的demo和前一篇是同一个,可以到github上下载不同的版本, 源码下载地址:

https://github.com/pony-maggie/DelegateDemo

A类(timeControl类)的头文件先要定义block,代码如下:

 
  1. //委托的协议定义
  2. @protocol UpdateAlertDelegate
  3. - (void)updateAlert:(NSString *tltle);
  4. @end
  5. @interface TimerControl : NSObject
  6. //委托变量定义
  7. @property (nonatomic, weak) id delegate;
  8. //block
  9. typedef void (^UpdateAlertBlock)(NSString *tltle);
  10. @property (nonatomic, copy) UpdateAlertBlock updateAlertBlock;
  11. - (void) startTheTimer;
  12. @end

A类的实现文件,原来用委托的地方改成调用block:

 
  1. - (void) timerProc
  2. {
  3. //[self.delegate updateAlert:@"this is title"];//委托更新UI
  4. //block代替委托
  5. if (self.updateAlertBlock)
  6. {
  7. self.updateAlertBlock(@"this is title");
  8. }
  9. }

再来看看视图类,实现block即可:

 
  1. - (void)viewDidLoad
  2. {
  3. [super viewDidLoad];
  4. // Do any additional setup after loading the view, typically from a nib.
  5. TimerControl *timer = [[TimerControl alloc] init];
  6. timer.delegate = self; //设置委托实例
  7. //实现block
  8. timer.updateAlertBlock = ^(NSString *title)
  9. {
  10. UIAlertView *alert=[[UIAlertView alloc] initWithTitle:title message:@"时间到" delegate:self cancelButtonTitle:nil otherButtonTitles:@"确定",nil];
  11. alert.alertViewStyle=UIAlertViewStyleDefault;
  12. [alert show];
  13. };
  14. [timer startTheTimer];//启动定时器,定时5触发
  15. }  

    //"被委托对象"实现协议声明的方法,由"委托对象"调用

    - (void)updateAlert:(NSString *title)

    {

    UIAlertView *alert=[[UIAlertView alloc] initWithTitle:title message:@"时间到" delegate:self cancelButtonTitle:nilotherButtonTitles:@"确定",nil];

    alert.alertViewStyle=UIAlertViewStyleDefault;

    [alert show];

    }

iOS 传值 委托(delegate)和block 对比的更多相关文章

  1. iOS基础之顺传逆传传值(delegate、block)

    写给iOS新手的福利! 在项目中经常会用到传值,根据传值的方向分为顺传(从根控制器到子控制器)和逆传(从子控制器到根控制器).在这里写了个Demo简单演示了效果,创建了两个控制器: 一个为根控制器,一 ...

  2. iOS开发-委托(Delegate)浅谈

    委托其实并不是OC中才有,C#中也有,不过彼此的理解方式是不一样的,OC中委托是协议的一种,需要使用@protocol声明,委托一般在iOS开发中页面中传值用的比较多.委托是Cocoa中最简单.最灵活 ...

  3. ios 设置委托delegate

    为了进行页面传值,也可以用委托的方法. 下面以时间控件为例. 1.首先,在.h 文件设置委托 #import <UIKit/UIKit.h> @protocol DatePickerVie ...

  4. ios多播委托

    在现实中回调的需求也分两种 一对一的回调. 一对多的回调. 对于一对一的回调,在IOS中使用delegate.block都能实现.而一对多的回调基本就是通知中心了. 假如现在有一个需求,我们以图片下载 ...

  5. IOS 多播委托(GCDMulticastDelegate)

    原文:http://www.cnblogs.com/dagehaoshuang/p/4043264.html 在IOS中为了实现回调一般有如下几个方法: delegate 通知中心 block KVO ...

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

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

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

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

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

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

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

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

随机推荐

  1. svn出现版本冲突之后的 无效路径

    .csproj.FileListAbsolute.txt  找到之后删掉错误的代码

  2. 启动Tomcat一闪而过——分析及解决过程

    启动Tomcat一闪而过--分析及解决过程 嗯,昨天将有关JDK的知识稍微整理了一下,现在稍微整理一下有关Tomcat的! 1:Tomcat是什么? Tomcat是当今世界上使用最为广泛的.开源免费的 ...

  3. java基础之 工具类

    一.StringUtils StringUtils.isEmpty(null) && StringUtils.isEmpty(""); // true String ...

  4. UliPad ----python 开发利器

    安装wxPython                                                                                          ...

  5. SharePoint Document Library中的"Versioning Settings"功能与CSOM的对应

     博客地址:http://blog.csdn.net/FoxDave SharePoint文档库关于版本的设置:"Versioning Settings",可以通过CSOM用L ...

  6. 常见的getchar 与EOF的问题

    代码中常有类似的如下的输入循环 char  c; while((c=getchar())!=EOF).... 如果输入 字符+换行时,循环的代码会执行两次,主要是换行键作为字符存到了缓存队列中,第一次 ...

  7. vs2012 检测到有潜在危险的 Request.Form 值

    今天用vs2012写网站,其中要用到网页编辑器,调试时提示:检测到有潜在危险的 Request.Form 值随即上网搜索: 解决方法一:具体页面添加 ValidateRequest="fal ...

  8. css 绘制对话框三角符号

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  9. .net 下判断中英文字符串长度

    System.Text.Encoding.Default.GetBytes(str).Length

  10. C语言格式化输入不定长数组

    先随便写写,有空再整理. 直接贴代码 #include <stdio.h> #include <stdlib.h> //从一行标准输入中格式化输入一个不定长数组 void in ...