浅析 协议和block的反向传值

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


















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值