Objective-C中的Block回調模式

        在前面的博客中提到了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

  上面的總結暫且這麼說吧,是根據筆者本身的理解所總結的內容,難免有偏頗之處,歡迎批評指正,轉載請註明出處。接口

相關文章
相關標籤/搜索