淺析ios開發中Block塊文法的妙用

來源:互聯網
上載者:User

淺析ios開發中Block塊文法的妙用

事實上,任何一個應用的開發都離開多線程。而“塊”block與GCD就是蘋果OC語言中多線程的核心。 一.塊的內部結構 在oc中,塊文法以閉包的形式存在,每一個Objective-C對象都佔據著某個記憶體地區。塊本身也是一個對象,在存放塊的對象記憶體地區中,首個變數是指向Class的指標,該指標叫做isa。其餘記憶體裡含有塊對象正常運轉所需的各種資訊。 以下是塊文法的內部結構變數。 1.void* isa(指向class的對象指標) 2.int flags 3.int reserved 4.void(*)(void*,……) invoke(函數指標) 5.struct* descriptor(結構體描述) 根據上述塊文法的記憶體結構可知,其中最重要的就是invoke變數,這是一個函數指標,指向的就是塊的實現代碼。
二.塊在系統api回調中的應用
在iOS的原生api中,有不少的地方都用到了塊文法。其中最常見的主要是兩個地方,一個就是數組和字典的塊枚舉,這種枚舉方式是每一個NSArry和NSDictionary都內建的,其效率和便利性遠遠高於傳統的for迴圈。

[self.p_tableArrenumerateObjectsUsingBlock:^(id obj,NSUInteger idx, BOOL *stop) {

<#code#>

}]


另一個常見的地方就是頁面跳轉present之後的完成回調,

[self presentViewController:<(UIViewController *)> animated:<(BOOL)> completion:<^(void)completion>]


三.塊文法在UIAlertView中的集中代碼

UIAlertView是一個彈窗控制項,有一些按鈕,最常見的就是確認和取消,UIAlertView有一個代理處理這些按鈕,當使用者點擊後,該代理可以捕獲按鈕的下標,然後使用者根據下標Index寫一些邏輯代碼。

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex


快文法的第一個妙用就是可以直接在建立這個UIAlertView控制項的時候就已經寫好邏輯代碼,完全不用寫在以上回調中。

以下是具體實現。

第一步,申明一個全部的Block對象,根據UIAlertView的回調代理可知,該代理主要參數是一個NSInteger類型的參數,那麼我們申明的Block對象可以根據代理的實際情況來建立。

@property(nonatomic,copy)void(^p_alertBlock)(NSInteger);


第二部,在建立這個UIAltView的地方實現這個全部的Block對象。

if(!self.p_alertBlock)

{

self.p_alertBlock = ^(NSInteger buttonIndex)

{


AccountViewController *acc = accc;

switch (buttonIndex) {

case 0:

break;

case 1:

if([acc.p_fmdbdeleteObjc:list])

{

[acc.p_tableArrremoveObjectAtIndex:acc.p_didSelect];

[acc.p_tablereloadData];

}

break;

}

};

}

UIAlertView *alt = [[UIAlertViewalloc] initWithTitle:NSLocalizedString(@"tip",nil)message:NSLocalizedString(@"sureDelet",nil) delegate:selfcancelButtonTitle:NSLocalizedString(@"cancel",nil) otherButtonTitles:NSLocalizedString(@"ok",nil),nil];

[altshow];

這是一個刪除資料庫操作的彈窗,當使用者點擊確認的時候刪除資料庫的對象,點擊取消不做任何處理。 第三步,在UIAlertView的代理中運行快。

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex

{

self.p_alertBlock(buttonIndex);

}


這個用法有一個好處就是可以在UIAlertView還未建立之前就已經確定了它按鈕的處理,集中代碼,看起來更加的方便和直觀。

以上只是一個案例,在系統很多控制項中都可以這樣實現,諸如UIActionSheet等。


三.塊文法替代Delegate

提起ios的訊息通知,就少不了代理Delegate。代理儘管很方便,可是實現的過程比較繁瑣。如果使用塊文法的話,我們可以提前把回呼函數的代碼實現封裝到Block中作為參數傳遞給資料層,這樣子實際上在代理回調中

if(self.delegate && [self.delegaterespondsToSelector:@selector(setAddressSuccess:)])

{

[self.delegatesetAddressSuccess:self.accountList.remark];

}

這句話就被

Block(self.accountList.remark);所取代。

是不是更加的便捷了呢?關鍵是你根本就不用聲明代理,實現,設定代理,維護協議等等複雜的過程。

代理還有一個限制就是必須要對象化,假如一個工具類是一個類的執行個體方法,你想在某些操作之後把資料回調給C層,這個時候代理就無法實行了,但是Block只不是是一個對象而已,就像NSString一樣,可以協助你實現。


以上只是塊文法在系統控制項API回調中的妙用和兩個類之間代理的妙用,更多的功能還有待在實際開發中逐步挖掘發現。

仁者見仁,智者見智,塊文法究竟強大到何種地步,等你用多了就知道了。


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.