你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> 淺析ios開發中Block塊語法的妙用

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

編輯:IOS開發綜合

事實上,任何一個應用的開發都離開多線程。而“塊”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_tableArr enumerateObjectsUsingBlock:^(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_fmdb deleteObjc:list])

{

[acc.p_tableArr removeObjectAtIndex:acc.p_didSelect];

[acc.p_table reloadData];

}

break;

}

};

}

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

[alt show];

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

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

{

self.p_alertBlock(buttonIndex);

}


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

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


三.塊語法替代Delegate

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

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

{

[self.delegate setAddressSuccess:self.accountList.remark];

}

這句話就被

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

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

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


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

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


  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved