日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

浅析ios开发中Block块语法的妙用

發(fā)布時間:2024/9/30 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 浅析ios开发中Block块语法的妙用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

事實(shí)上,任何一個應(yīng)用的開發(fā)都離不開多線程。而“塊”block與GCD就是蘋果OC語言中多線程的核心。 ? ?? 一.塊的內(nèi)部結(jié)構(gòu) ? ? ?在oc中,塊語法以閉包的形式存在,每一個Objective-C對象都占據(jù)著某個內(nèi)存區(qū)域。塊本身也是一個對象,在存放塊的對象內(nèi)存區(qū)域中,首個變量是指向Class的指針,該指針叫做isa。其余內(nèi)存里含有塊對象正常運(yùn)轉(zhuǎn)所需的各種信息。 ? ? 以下是塊語法的內(nèi)部結(jié)構(gòu)變量。 ? ? 1.void* ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? isa(指向class的對象指針) ? ? 2.int ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? flags ? ? 3.int ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? reserved ? ? 4.void(*)(void*,……) ?invoke(函數(shù)指針) ? ? 5.struct* ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? descriptor(結(jié)構(gòu)體描述) ?? ? ? 根據(jù)上述塊語法的內(nèi)存結(jié)構(gòu)可知,其中最重要的就是invoke變量,這是一個函數(shù)指針,指向的就是塊的實(shí)現(xiàn)代碼。
二.塊在系統(tǒng)api回調(diào)中的應(yīng)用
? ?在iOS的原生api中,有不少的地方都用到了塊語法。其中最常見的主要是兩個地方,一個就是數(shù)組和字典的塊枚舉,這種枚舉方式是每一個NSArry和NSDictionary都自帶的,其效率和便利性遠(yuǎn)遠(yuǎn)高于傳統(tǒng)的for循環(huán)。 ??

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

? ? ? ? ? ? ? ? ? ? <#code#>

? ? ? ? ? ? ? ? }]


另一個常見的地方就是頁面跳轉(zhuǎn)present之后的完成回調(diào),

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


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

?UIAlertView是一個彈窗控件,有一些按鈕,最常見的就是確認(rèn)和取消,UIAlertView有一個代理處理這些按鈕,當(dāng)用戶點(diǎn)擊后,該代理可以捕獲按鈕的下標(biāo),然后用戶根據(jù)下標(biāo)Index寫一些邏輯代碼。

??

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


? 快語法的第一個妙用就是可以直接在創(chuàng)建這個UIAlertView控件的時候就已經(jīng)寫好邏輯代碼,完全不用寫在以上回調(diào)中。

? 以下是具體實(shí)現(xiàn)。

? 第一步,申明一個全部的Block對象,根據(jù)UIAlertView的回調(diào)代理可知,該代理主要參數(shù)是一個NSInteger類型的參數(shù),那么我們申明的Block對象可以根據(jù)代理的實(shí)際情況來創(chuàng)建。

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


? 第二部,在創(chuàng)建這個UIAltView的地方實(shí)現(xiàn)這個全部的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];

這是一個刪除數(shù)據(jù)庫操作的彈窗,當(dāng)用戶點(diǎn)擊確認(rèn)的時候刪除數(shù)據(jù)庫的對象,點(diǎn)擊取消不做任何處理。 第三步,在UIAlertView的代理中運(yùn)行快。

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

{

? ?self.p_alertBlock(buttonIndex);

}


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

? 以上只是一個事例,在系統(tǒng)很多控件中都可以這樣實(shí)現(xiàn),諸如UIActionSheet等。

??


??三.塊語法替代Delegate

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

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

? ? ? ? {

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

? ? ? ? }

這句話就被

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

? 是不是更加的便捷了呢?關(guān)鍵是你根本就不用聲明代理,實(shí)現(xiàn),設(shè)置代理,維護(hù)協(xié)議等等復(fù)雜的過程。

??

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


? 以上只是塊語法在系統(tǒng)控件API回調(diào)中的妙用和兩個類之間代理的妙用,更多的功能還有待在實(shí)際開發(fā)中逐步挖掘發(fā)現(xiàn)。

??

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


總結(jié)

以上是生活随笔為你收集整理的浅析ios开发中Block块语法的妙用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。