浅析 协议和block的反向传值
2016-01-25 23:29
411 查看
假设有这样的一个需求:公司(company)要买木材,但是公司让(worker)去买,需要在买到木材是,将所买的木材的数量反馈给公司
看到上面这个需求 ,在OC中我们想到的是通过传值来解决,就要利用协议或者block来实现传值,但是许多刚刚接触OC的人都对于传值过程中 谁制定协议 和 实现传值的过程中感到凌乱,我最开始也是感觉有点绕,不过在做了一些练习题在总结一下 ,也就豁然开朗了。
在处理这一类问题中 我们首先要做的第一步 找到数据的流动方向,在上面的需求中,虽然公司是提出需求的一方,但是数据(也就是木材)是由工人到公司。
第一点:协议总是由数据流动的发起方制定协议,而另一方则必须遵守协议 worker---------------------->company,也就是协议的制定书写在worker类中,而协议的遵守和实现则放在company类中
第二点:协议的制定放需要声明一I个遵从协议D类型的指针来存放代理对象 一般书写为 @property id<协议名称> delegate
第三点:传值是由需求方发起的(在本类中为company)也就是在需求类中创建一个类方法 ,方法中再调用制定协议的类中实现需求的方法,实现需求的方法中再调用协议,回传数据
详细代码如下:
#import
<Foundation/Foundation.h>
#import
"Company.h"
#import
"Worker.h"
int
main(int
argc, const char
* argv[]) {
@autoreleasepool
{
Company
*cp = [[Company
alloc
]init];
[cp wantMoods];
[cp wantMoods];
[cp showMoods];
}
return
0;
}
#import
<Foundation/Foundation.h>
#import "Worker.h"
@interface Company :
NSObject<sentMoods>
@property(nonatomic,assign)
NSUInteger
moods;
@property
Worker * worker;
-(void)wantMoods;
-(void)showMoods;
@end
#import
"Company.h"
#import "Worker.h"
@implementation
Company
-(instancetype)init{
if (self
= [super
init]) {
_worker = [[Worker
alloc]
init];
_worker.delegate
=self;
}
return self;
}
-(void)sendMoodsToCompanny:
(NSUInteger)number{
self.moods
+=number;
}
-(void)wantMoods{
[_worker bugMoods];
}
-(void)showMoods{
[_worker showMoods];
NSLog(@"公司 ⼀共 有
%lu根⽊
材",self.moods);
}
@end
#import
<Foundation/Foundation.h>
@protocol sentMoods <NSObject>
-(void)sendMoodsToCompanny:
(NSUInteger)number;
@end
@interface Worker :
NSObject
@property(nonatomic,assign)
NSUInteger
moods;
@property id<sentMoods> delegate;
-(void)bugMoods;
-(void)showMoods;
@end
#import
"Worker.h"
#import "Company.h"
@implementation
Worker
-(void)bugMoods{
NSUInteger number=100;
[_delegate
sendMoodsToCompanny:number];
self.moods
= number;
}
-(void)showMoods{
13e1f
NSLog(@"Worker这次共买了%lu根⽊
材",self.moods);
}
@end
以前是利用协议传值的代码,下面我们来书写用block传值的代码
用block时就不会制定协议了,但是我们还是可以用上面的思路来做,数据流向的发起方的类中创建block对象,并且在重写init方法完成对block对象的赋值
#import
<Foundation/Foundation.h>
#import
"Worker.h"
#import
"Company.h"
int
main(int
argc, const char
* argv[]) {
@autoreleasepool
{
Company
*cp = [[Company
alloc
]
init];
[cp wantMoods];
[cp wantMoods];
[cp showMoods];
}
return
0;
}
#import
<Foundation/Foundation.h>
@interface
Worker :
NSObject
@property(nonatomic,assign)
NSUInteger
moods;
@property(nonatomic,copy)
void(^block)
(NSUInteger
number);
-(void)bugMoods;
-(void)showMoods;
@end
#import
"Worker.h"
#import "Company.h"
@implementation
Worker
-(void)bugMoods{
NSUInteger number=100;
self.moods
= number;
_block(number);
}
-(void)showMoods{
NSLog(@"Worker这次共买了%lu根⽊
材",self.moods);
}
@end
-------------------------------
#import
<Foundation/Foundation.h>
#import "Worker.h"
@interface Company :
NSObject
@property(nonatomic,assign)
NSUInteger
moods;
@property(nonatomic,copy)
Worker *
worker;
-(void)wantMoods;
-(void)showMoods;
@end
#import
"Company.h"
#import
"Worker.h"
@implementation
Company
-(instancetype)init{
if
(self
= [super
init]) {
_worker
= [[Worker
alloc]
init];
_worker.block=^(NSUInteger
number){
_moods
+= number;
};
}
return self;
}
-(void)wantMoods{
[_worker
bugMoods];
}
-(void)showMoods{
[_worker showMoods];
NSLog(@"公司 ⼀共 有
%lu根⽊
材",self.moods);
}
@end
看到上面这个需求 ,在OC中我们想到的是通过传值来解决,就要利用协议或者block来实现传值,但是许多刚刚接触OC的人都对于传值过程中 谁制定协议 和 实现传值的过程中感到凌乱,我最开始也是感觉有点绕,不过在做了一些练习题在总结一下 ,也就豁然开朗了。
在处理这一类问题中 我们首先要做的第一步 找到数据的流动方向,在上面的需求中,虽然公司是提出需求的一方,但是数据(也就是木材)是由工人到公司。
第一点:协议总是由数据流动的发起方制定协议,而另一方则必须遵守协议 worker---------------------->company,也就是协议的制定书写在worker类中,而协议的遵守和实现则放在company类中
第二点:协议的制定放需要声明一I个遵从协议D类型的指针来存放代理对象 一般书写为 @property id<协议名称> delegate
第三点:传值是由需求方发起的(在本类中为company)也就是在需求类中创建一个类方法 ,方法中再调用制定协议的类中实现需求的方法,实现需求的方法中再调用协议,回传数据
详细代码如下:
#import
<Foundation/Foundation.h>
#import
"Company.h"
#import
"Worker.h"
int
main(int
argc, const char
* argv[]) {
@autoreleasepool
{
Company
*cp = [[Company
alloc
]init];
[cp wantMoods];
[cp wantMoods];
[cp showMoods];
}
return
0;
}
#import
<Foundation/Foundation.h>
#import "Worker.h"
@interface Company :
NSObject<sentMoods>
@property(nonatomic,assign)
NSUInteger
moods;
@property
Worker * worker;
-(void)wantMoods;
-(void)showMoods;
@end
#import
"Company.h"
#import "Worker.h"
@implementation
Company
-(instancetype)init{
if (self
= [super
init]) {
_worker = [[Worker
alloc]
init];
_worker.delegate
=self;
}
return self;
}
-(void)sendMoodsToCompanny:
(NSUInteger)number{
self.moods
+=number;
}
-(void)wantMoods{
[_worker bugMoods];
}
-(void)showMoods{
[_worker showMoods];
NSLog(@"公司 ⼀共 有
%lu根⽊
材",self.moods);
}
@end
#import
<Foundation/Foundation.h>
@protocol sentMoods <NSObject>
-(void)sendMoodsToCompanny:
(NSUInteger)number;
@end
@interface Worker :
NSObject
@property(nonatomic,assign)
NSUInteger
moods;
@property id<sentMoods> delegate;
-(void)bugMoods;
-(void)showMoods;
@end
#import
"Worker.h"
#import "Company.h"
@implementation
Worker
-(void)bugMoods{
NSUInteger number=100;
[_delegate
sendMoodsToCompanny:number];
self.moods
= number;
}
-(void)showMoods{
13e1f
NSLog(@"Worker这次共买了%lu根⽊
材",self.moods);
}
@end
以前是利用协议传值的代码,下面我们来书写用block传值的代码
用block时就不会制定协议了,但是我们还是可以用上面的思路来做,数据流向的发起方的类中创建block对象,并且在重写init方法完成对block对象的赋值
#import
<Foundation/Foundation.h>
#import
"Worker.h"
#import
"Company.h"
int
main(int
argc, const char
* argv[]) {
@autoreleasepool
{
Company
*cp = [[Company
alloc
]
init];
[cp wantMoods];
[cp wantMoods];
[cp showMoods];
}
return
0;
}
#import
<Foundation/Foundation.h>
@interface
Worker :
NSObject
@property(nonatomic,assign)
NSUInteger
moods;
@property(nonatomic,copy)
void(^block)
(NSUInteger
number);
-(void)bugMoods;
-(void)showMoods;
@end
#import
"Worker.h"
#import "Company.h"
@implementation
Worker
-(void)bugMoods{
NSUInteger number=100;
self.moods
= number;
_block(number);
}
-(void)showMoods{
NSLog(@"Worker这次共买了%lu根⽊
材",self.moods);
}
@end
-------------------------------
#import
<Foundation/Foundation.h>
#import "Worker.h"
@interface Company :
NSObject
@property(nonatomic,assign)
NSUInteger
moods;
@property(nonatomic,copy)
Worker *
worker;
-(void)wantMoods;
-(void)showMoods;
@end
#import
"Company.h"
#import
"Worker.h"
@implementation
Company
-(instancetype)init{
if
(self
= [super
init]) {
_worker
= [[Worker
alloc]
init];
_worker.block=^(NSUInteger
number){
_moods
+= number;
};
}
return self;
}
-(void)wantMoods{
[_worker
bugMoods];
}
-(void)showMoods{
[_worker showMoods];
NSLog(@"公司 ⼀共 有
%lu根⽊
材",self.moods);
}
@end
相关文章推荐
- Android Native 绘图方法
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 我是运营,我没有假期
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- DB2数据库的安装
- C#实现把指定数据写入串口
- “传奇”图象数据存储方式
- 修复mysql数据库
- C#中struct和class的区别详解
- 浅析SQL数据操作语句
- SQLServer 数据导入导出的几种方法小结
- MySQL数据备份之mysqldump的使用详解
- C#实现窗体间传递数据实例
- VBS ArrayList Class vbs中的数组类
- 大家看了就明白了css样式中类class与标识id选择符的区别小结