假设有这样的一个需求:公司(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{
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