在前面的部落格中提到了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 //定義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 @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 |
#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回撥好在哪,還得親自使用一下才知道啊。
上面的總結暫且這麼說吧,是根據筆者自己的理解所總結的內容,不免有偏頗之處,歡迎批評指正,轉載請註明出處。
打賞支援我寫出更多好文章,謝謝!
打賞作者
打賞支援我寫出更多好文章,謝謝!