OC中的block與swift中的閉包理解

關(guān)于block

一. 什么是block?

Block是帶有局部變量的匿名函數(shù). 等等,這句話是不是比較拗口,有點(diǎn)難理解對(duì)不對(duì),這樣,你就記住,Block就是一個(gè)代碼塊,用個(gè)大括號(hào)包6起來(lái),它預(yù)先準(zhǔn)備好,但是暫時(shí)不執(zhí)行,要再需要的時(shí)候在調(diào)用執(zhí)行. 就這么簡(jiǎn)單. 那么問(wèn)題來(lái)了,既然它是一個(gè)被包起來(lái)的代碼塊, 那么它也是一種數(shù)據(jù)類型,也就可以當(dāng)做參數(shù)來(lái)傳遞,也就可以定義成屬性.
example: 舉一個(gè)生活中的簡(jiǎn)單例子,可以幫助我們來(lái)理解block.
大家都聽(tīng)說(shuō)”錦囊妙計(jì)”這個(gè)典故,block就是那個(gè)錦囊,你把錦囊揣在口袋里,遇到麻煩的時(shí)候,不知道怎么辦了,需要用到錦囊的時(shí)候,再打開(kāi),按照錦囊里面寫的內(nèi)容去做.來(lái)解決麻煩.

二, block的用途

那么我們?cè)谀切┑胤娇梢杂玫絙lock呢? 其使用場(chǎng)景與代理是類似的,但是比代理要的代碼量要少很多,也相對(duì)簡(jiǎn)單些

A ,可以用于自定義視圖的反向傳值
B, modal/POP 控制器的反向傳值
C, 異步方法執(zhí)行完畢后的反向傳值

三, block的傳值的方法:

返現(xiàn)傳遞的數(shù)據(jù)通過(guò)block的參數(shù)來(lái)傳遞,一般稱為回調(diào)

四, 代碼(反向傳值)

Demo: DewViewController得到數(shù)據(jù)之后回傳值給ViewController

  • 第一步:在DewViewController中定義一個(gè)block類型的數(shù)據(jù)
@property (nonatomic,copy) void(^block)(NSString *nameText);
  • 第二步: 在ViewController中定義一個(gè)等待執(zhí)行的代碼塊,
  • 第三步: 獲取目標(biāo)控制器,將代碼塊丟給目標(biāo)控制器的屬性
//監(jiān)聽(tīng)控制器的跳轉(zhuǎn)
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    //1.定義好一個(gè)等待執(zhí)行的代碼塊
    void (^block)() = ^(NSString *nameText){
    
        self.nameLable.text = nameText;
    
    };
    
    //2. 獲取目標(biāo)控制器
    
    DewViewController *detailVC = segue.destinationViewController;
    
    //3. 在控制器跳轉(zhuǎn)的時(shí)候,把blocke傳入到DewViewController
    if (detailVC != nil){  
        detailVC.block = block;
    }
}
  • 第四步: 在DewViewController中的按鈕點(diǎn)擊方法中,把textField中獲取的值交給屬性block回傳給ViewController,代碼塊這個(gè)時(shí)候開(kāi)始執(zhí)行,這樣ViewController中的label就獲取到了DewViewController的值
- (IBAction)saveAction:(id)sender {
    if(self.nameTextField != nil){
        //調(diào)用block,傳入?yún)?shù)
        self.block(self.nameTextField.text);
    }
    [self.navigationController popViewControllerAnimated:YES];
}
五, 需要注意的是: 循環(huán)引用問(wèn)題

造成循環(huán)引用問(wèn)題的原因: 在定義一個(gè)block類型的屬性是,使用copy,表示'self' 強(qiáng)引用了block,那如果在block中強(qiáng)引用了'self',就會(huì)造成循環(huán)引用
解決辦法: 在方法中使用 __weak

__weak typeof(self) weakSelf = self;

關(guān)于swift閉包

一, 所謂閉包,其定義和用法和OC中的block非常類似.可以這樣理解: block能完成的功能,閉包都能做到. 但是不管怎么樣,還是有點(diǎn)區(qū)別的
二, Demo-虛擬下載完電影之后更新UI,用閉包回調(diào),實(shí)現(xiàn)反向傳值
a. 定義一個(gè)變量 變量名是callBack, 類型是閉包

var callBack: ((String)->())?

b. 用閉包作為參數(shù)傳遞

 //下載電影
    func downloadMovie (callBack: @escaping (String) -> ()) {   
        self.callBack = callBack
        DispatchQueue.global().async(execute: {})
        //模擬異步加載數(shù)據(jù)
        DispatchQueue.global().async { 
            Thread.sleep(forTimeInterval: 2)
            let movieName = "模仿游戲"
            //完成后,在主線程更新UI
            DispatchQueue.main.async(execute: {
                //閉用閉包刷新UI
                callBack(movieName)
            })
        }
    }

c. 在viewDidLoad中調(diào)用downloadMove方法,傳入?yún)?shù):閉包

  override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = UIColor.white
        //添加label
        let label = customLabel(title: "正在下載...")
        view.addSubview(label)
        //調(diào)用下載電影的方法,傳入?yún)?shù),就可以直接調(diào)用下面大括號(hào)里面的代碼-(尾隨閉包)
        downloadMovie {
            [weak self](movieName: String) in
            label.text = "\(movieName), 下載完成!"
            print(self!)
        }
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末醉锅,一起剝皮案震驚了整個(gè)濱河市告组,隨后出現(xiàn)的幾起案子窄陡,更是在濱河造成了極大的恐慌免猾,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,222評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件狰右,死亡現(xiàn)場(chǎng)離奇詭異陡蝇,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)厂画,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,455評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)拷邢,“玉大人袱院,你說(shuō)我怎么就攤上這事〔t稼!?“怎么了忽洛?”我有些...
    開(kāi)封第一講書人閱讀 157,720評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)环肘。 經(jīng)常有香客問(wèn)我欲虚,道長(zhǎng),這世上最難降的妖魔是什么悔雹? 我笑而不...
    開(kāi)封第一講書人閱讀 56,568評(píng)論 1 284
  • 正文 為了忘掉前任复哆,我火速辦了婚禮,結(jié)果婚禮上腌零,老公的妹妹穿的比我還像新娘梯找。我一直安慰自己,他們只是感情好益涧,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,696評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布锈锤。 她就那樣靜靜地躺著,像睡著了一般闲询。 火紅的嫁衣襯著肌膚如雪牙咏。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,879評(píng)論 1 290
  • 那天嘹裂,我揣著相機(jī)與錄音,去河邊找鬼摔握。 笑死寄狼,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的氨淌。 我是一名探鬼主播泊愧,決...
    沈念sama閱讀 39,028評(píng)論 3 409
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼盛正!你這毒婦竟也來(lái)了删咱?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,773評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤豪筝,失蹤者是張志新(化名)和其女友劉穎痰滋,沒(méi)想到半個(gè)月后摘能,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,220評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡敲街,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,550評(píng)論 2 327
  • 正文 我和宋清朗相戀三年团搞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片多艇。...
    茶點(diǎn)故事閱讀 38,697評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡逻恐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出峻黍,到底是詐尸還是另有隱情复隆,我是刑警寧澤,帶...
    沈念sama閱讀 34,360評(píng)論 4 332
  • 正文 年R本政府宣布姆涩,位于F島的核電站挽拂,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏阵面。R本人自食惡果不足惜轻局,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,002評(píng)論 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望样刷。 院中可真熱鬧仑扑,春花似錦、人聲如沸置鼻。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,782評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)箕母。三九已至储藐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間嘶是,已是汗流浹背钙勃。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,010評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留聂喇,地道東北人辖源。 一個(gè)月前我還...
    沈念sama閱讀 46,433評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像希太,于是被迫代替她去往敵國(guó)和親克饶。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,587評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容