假設有這樣的一個需求:公司(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