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方法,下面的代碼是控制器中的接口部分代碼,接口部分只聲明了控制器啟動的方法,代碼如下:

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回調好在哪,還得親自使用一下才知道啊。

  上面的總結暫且這么說吧,是根據筆者自己的理解所總結的內容,不免有偏頗之處,歡迎批評指正,轉載請注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM