您的位置:首页 > 移动开发 > IOS开发

浅析 协议和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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息