在前面的博客中提到了Block的概念和使用方法,個人感覺Block最爽的用法莫過於在回調時用block。感覺比委托回調和目標方法回調用着要順手,好不好用還得讀者親自用一下才知道。如果 讀者之前用過SSH框架的話,看到OC中的Block回調,會感覺非常的親切,和Java中的接口回調像極了。還是那句話,上些Block的回調代碼最為直接。下面的demo是根據筆者的理解,自己設計的一個小小的Block回調的 demo,難免會有不足之處,還望批評指正,尊重原創,轉載請注明出處。
為了實現我們的Block回調,我們需要模擬一個組件(Component)和一個控制器(Controller)。在Component中我們只給出代碼塊的聲明,不進行實現,然后在Controller中進行實現,在Component中進行調用,也就是說由組件提供代碼塊的形式和代碼塊的參數,在Controller中給出業務邏輯。可能有的小伙伴看完上面的功能描述多少會有些抽象,廢話少說,代碼 走起!
1.為了更好的理解,我們就先寫組件的接口部分,接口部分需要給出代碼塊的定義和聲明,然后再提供一個外部代碼塊的入口函數,相當於前面目標方法回調的注冊方法,再提供一個執行代碼塊的方法,組件的接口如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
// ComponentBlock.h
// Memory
// Created by ludashi on 14-8-19.
// Copyright (c) 2014年 Mr.li. All rights reserved.
//
#import <Foundation/Foundation.h>
//定義Block塊類型的變量
typedef
void
(^BlockType) (NSString *parameter);
@interface ComponentBlock : NSObject
//聲明Block類型的變量
@property (nonatomic, strong)BlockType blockDemo;
//接受要回調的代碼塊,把接受的代碼塊賦給成員變量blockDemo
-(
void
)setBlockDemoTest:(BlockType)blockDemo;
//執行代碼塊的方法
-(
void
)runBlock;
@end
|
2.組件的@interface寫完我們就開始編寫組件的實現部分了,組件的實現部分也挺簡單的,就是實現我們在接口中聲明的方法,我們在set方法中給block賦值,在runBlock中進行代碼塊的調用,組件中代碼塊是調用控制器中的代碼塊,所以稱為代碼塊的回調,代碼如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
#import "ComponentBlock.h"
@implementation ComponentBlock
-(
void
)setBlockDemoTest:(BlockType)blockDemo
{
self.blockDemo = blockDemo;
}
-(
void
)runBlock
{
self.blockDemo(@
"我是組件提供的參數"
);
}
@end
|
3.組件寫完以后我們就開始寫我們的Controller方法,下面的代碼是控制器中的接口部分代碼,接口部分只聲明了控制器啟動的方法,代碼如下:
1
2
3
4
|
#import <Foundation/Foundation.h>
@interface Controller : NSObject
-(
void
)start;
@end
|
4.控制器的實現部分是控制器的核心部分,為了實現組件的封裝,我們用延展來隱藏我們組件要用到的方法,在延展中聲明了我們要使用的組件,然后再實現部分進行組件的初始化和編寫組件中要調用的代碼塊,代碼塊中的參數由組件提供,而控制器只提供業務邏輯控制,在控制器中我們需要 啟動我們要使用的組件,也就是組件中的runBlock方法。代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
#import "Controller.h"
#import "ComponentBlock.h"
//為了實現信息的隱藏我們用延展來聲明組件
@interface Controller ()
//聲明組件
@property (nonatomic, strong) ComponentBlock *component;
@end
//---------實現----------------
@implementation Controller
//在controller中對組件進行初始化
- (instancetype)init
{
self = [super init];
if
(self) {
self.component = [ComponentBlock
new
];
//進行代碼塊的回調
[self.component setBlockDemoTest:^
void
(NSString *parameter)
{
//打印回調的參數
NSLog(@
"%@"
, parameter);
}];
}
return
self;
}
-(
void
)start
{
//調用組件的方法,執行代碼塊
[self.component runBlock];
}
@end
|
5.Block回調的測試:在mian函數中進行控制器的實例化和啟動控制器,代碼如下:
1
2
3
4
5
6
7
|
@autoreleasepool {
Controller *controller = [[Controller alloc] init];
[controller start];
}
return
0;
|
代碼運行結果如下:
1
|
2014-08-19 17:29:08.904 OC9-Test1[2249:303] 我是組件提供的參數
|
以上是Block回調的小demo,讀者可以和前面博客中的委托回調和目標方法回調進行一個對比,具體哪一個好用,就看讀者個人所好了。Block是后來蘋果公司對OC的擴充,就像PHP5.3以后也支持閉包了一樣,在之前封裝的組件都是用目標方法回調或委托回調實現的,至於Block回調好在哪,還得親自使用一下才知道啊。
上面的總結暫且這么說吧,是根據筆者自己的理解所總結的內容,不免有偏頗之處,歡迎批評指正,轉載請注明出處。