淺析 協議和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


















發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章