iOS数据回调三大利器——代理、通知与Block
来源:互联网 发布:淘宝申请企业店铺条件 编辑:程序博客网 时间:2024/04/28 16:40
iOS数据回调三大利器——代理、通知与Block
引子:
在实际开发中我们经常遇到需要跨方法,甚至跨文件访问数据或传输信息,跨方法是比较简单的,只要我们声明一个全局变量,并为其赋值,就可以在同一个文件中的任意位置调用了。而跨文件传输数据,就要相对麻烦一点了,开发中常用的方法有代理、通知和block,下面我们将逐一介绍。
为了介绍这三种方法,我们写一个小Demo,对这三种方法进行说明。界面比较简单,搭界面我们就不在这里展示了,主要展示数据传递的方法,思路是点击相应按钮,把各自文件中的数据传过来,显示在上面的label。
一、代理
代理的使用,可以简单的概括为两个三步走,即创建代理的三步和使用代理的三步。
创建代理:
* 创建代理协议
* 声明代理方法
* 声明代理属性
使用代理:
* 遵守代理协议
* 设置代理对象
* 实现代理方法
下面我们直接上代码,实现点击代理按钮,上面的label显示“这是代理传的值”
#import <UIKit/UIKit.h>@class Demo;//创建代理协议@protocol DemoDelegate <NSObject>//声明代理方法@optional- (void)demoName:(NSString *)name;@end@interface Demo : UIView//声明代理属性@property (nonatomic, weak) id<DemoDelegate> delegate;@end
/*调用代理方法*/- (void)deleBtnClick{ //要传递的对象 NSString *myText = @"这是代理传的值"; if ([self.delegate respondsToSelector:@selector(demoName:)]) { [self.delegate demoName:myText]; } }
/*实现代理方法*/-(void)demoName:(NSString *)name{ self.myLabel.text = name;}
代理回调是这三种方法中最简单最直接的,一对一传值是代理传值最显著的特点。
二、通知
每一个应用程序都有一个通知中心(NSNotificationCenter)实例,专门负责协助不同对象之间的信息通信。
任何一个对象都可以向通知中心发布通知(NSNotification),描述自己在做什么。其他感兴趣的对象(Observer)可以申请在特定通知发布时(或在某个特定的对象发布通知时)收到这个通知。
通知和代理最大的不同就是,通知可以实现一对多传值。代理实现可以分为以下几步:
* 创建发布通知的对象和接收通知的对象
* 创建通知
* 获取通知中心
* 注册监听者
* 发布通知
* 销毁监听对象
这是一个完整的监听的实现,在使用过程中某些步骤可以省略合并,监听的实现如下图所示:
下面就上代码了
/*发布通知*/- (void)notyBtnClick{ //要传递的对象 NSString *myText = @"这是通知传的值"; [[NSNotificationCenter defaultCenter] postNotificationName:kMyNotyName object:myText];}
/*注册监听*/[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(noty:) name:kMyNotyName object:nil];
/*接收通知*/- (void)noty:(NSNotification *)noty{ self.myLabel.text = noty.object;}
- (void)dealloc{ // 移除通知 [[NSNotificationCenter defaultCenter] removeObserver:self];}
二、Block
这里有必要对Block的结构做一个简单的梳理
Black对象是一个c语言级别的语法和运行机制。它与标准c函数类似,不同之处在于,它除了有可执行的代码之外,还包含了与堆、栈内存绑定的变量。作为一个回调,Block特别的有用,因为block既包含了回调期间的代码,又包含了执行期间需要的数据。一个标准的block声明如下:
int (^myBlock)(init)=^(int num){return num *multiplier;};
下面就用代码说明Block传值
//声明块,这个块的返回值类型为void,参数类型为Nsstring,形参名为myText@interface Demo : UIView@property (nonatomic, copy) void (^myBlock)(NSString *myText);@end
-(void)blockBtnClick{ //要传递的对象 NSString *myText = @"这是block传的值"; if (self.myBlock) { self.myBlock(myText); }}
myView.myBlock = ^(NSString *myText){ weakSelf.myLabel.text = myText; };
- iOS数据回调三大利器——代理、通知与Block
- iOS - block、代理、通知
- ios开发——实用技术篇&Block/KVO/通知/代理
- ios 代理、block和通知
- IOS回调机制——代理,通知中心以及Block
- IOS回调机制——代理,通知中心以及Block
- IOS回调机制——代理,通知中心以及Block
- IOS回调机制——代理,通知中心以及Block
- iOS 通知,代理,单例,block传值
- iOS知识点之一代理、通知、block
- iOS中 block 代理 通知的区别
- iOS中代理、通知、block的使用
- KVO、BLOCK、代理、通知
- 代理 通知 和block
- iOS 页面间几种传值方式(属性,代理,block,单例,通知
- iOS页面间传值方式(代理Delegate,通知Notification,块Block)
- iOS 开发中的消息机制-代理、通知、block
- iOS开发--当Block、代理、通知遇到女朋友
- Intellij Idea调试功能总结
- 我理解的X.509
- Android蓝牙串口通信模板及demo,trick
- Python学习笔记(一)
- Android四种常见设计模式说明
- iOS数据回调三大利器——代理、通知与Block
- 面试题(一)
- LPS
- 面试:数组:twosum
- android studio导入背景图片,改变图标,定时退出三个操作
- hadoop笔记
- hadoop中mapreduce程序的几种提交运行模式
- Android动画三:属性动画 (property animation)
- linux 网络配置