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