在前面的博客中提到了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方法,下面的代碼是控制器中的接口部分代碼,接口部分只聲明瞭控制器啓動的方法,代碼以下:atom
1
2
3
4
|
#import <Foundation/Foundation.h>
@interface Controller : NSObject
-(
void
)start;
@end
|
4.控制器的實現部分是控制器的核心部分,爲了實現組件的封裝,咱們用延展來隱藏咱們組件要用到的方法,在延展中聲明瞭咱們要使用的組件,而後再實現部分進行組件的初始化和編寫組件中要調用的代碼塊,代碼塊中的參數由組件提供,而控制器只提供業務邏輯控制,在控制器中咱們須要 啓動咱們要使用的組件,也就是組件中的runBlock方法。代碼以下:spa
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;
|
代碼運行結果以下:code
1
|
2014-08-19 17:29:08.904 OC9-Test1[2249:303] 我是組件提供的參數
|
以上是Block回調的小demo,讀者能夠和前面博客中的委託回調和目標方法回調進行一個對比,具體哪個好用,就看讀者我的所好了。Block是後來蘋果公司對OC的擴充,就像PHP5.3之後也支持閉包了同樣,在以前封裝的組件都是用目標方法回調或委託回調實現的,至於Block回調好在哪,還得親自使用一下才知道啊。component
上面的總結暫且這麼說吧,是根據筆者本身的理解所總結的內容,難免有偏頗之處,歡迎批評指正,轉載請註明出處。接口