swift 閉包(類似OC中block)

swift中的閉包

類似OC中block

  • OC中block 回顧
    創(chuàng)建個HttpTool類
    .h
@interface HttpTool : NSObject

// void(返回值)(^代表block)(參數(shù))
- (void)loadData:(void(^)(NSString *jsonData))callBack;

@end

.m

#import "HttpTool.h"

@implementation HttpTool

- (void)loadData:(void (^)(NSString *))callBack
{
    
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSLog(@"發(fā)送網(wǎng)絡(luò)請求:%@", [NSThread currentThread]);
        
        dispatch_sync(dispatch_get_main_queue(), ^{
            NSLog(@"拿到數(shù)據(jù),并且進行回調(diào):%@", [NSThread currentThread]);
            
            //調(diào)用block
            callBack(@"json數(shù)據(jù)");
        });
    });
}

@end

控制器中

#import "ViewController.h"
#import "HttpTool.h"

@interface ViewController ()

/** 注釋 */
@property (nonatomic, strong) HttpTool *tools;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.tools = [[HttpTool alloc] init];
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
//self.tools 調(diào)用 loadData:方法 
//loadData:方法中調(diào)用block,并傳入NSString參數(shù)
//下面的jsonData 即為block回調(diào)的NSString參數(shù)

    [self.tools loadData:^(NSString *jsonData) {
        NSLog(@"在ViewController拿到數(shù)據(jù):%@", jsonData);
    }];
}
  • swift中的閉包
  • 閉包的類型
() -> ()
閉包的類型: (參數(shù)列表) -> (返回值類型)

創(chuàng)建個HttpTool類

import UIKit

class HttpTool: NSObject {
    // 閉包的類型: (參數(shù)列表) -> (返回值類型)
    func loadData(callBack : (jsonData : String) -> ()) {

        dispatch_async(dispatch_get_global_queue(0, 0)) { () -> Void in
            print("發(fā)送網(wǎng)絡(luò)請求:\(NSThread.currentThread())")
            
            dispatch_sync(dispatch_get_main_queue(), { () -> Void in
                print("獲取到數(shù)據(jù),并且進行回調(diào):\(NSThread.currentThread())")
                
                callBack(jsonData: "jsonData數(shù)據(jù)")
            })
        }
    }
}

控制器中

import UIKit

class ViewController: UIViewController {
    
//這里的 HttpTool 不需要導(dǎo)入,swift特性
    var tools : HttpTool = HttpTool()
    
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {

        tools.loadData { (jsonData) -> () in

            print("在ViewController拿到數(shù)據(jù):\(jsonData)")
          
        }
    }
}
  • 閉包中的循環(huán)引用解決
    還是上面的例子,針對閉包中的使用 self 造成循環(huán)引用的解決
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {

        /*
        解決方法一:
        類似oc中 __weak typeof(self) weakself = self 寫法
        weakself?.view
        如果前面的可選類型,沒有值,后面所有的代碼都不會執(zhí)行
        如果前面的可選類型,有值,系統(tǒng)會自動將weakself進行解包,并且使用weakself
        */
        weak var weakself = self
        tools.loadData { (jsonData) -> () in
            // print("在ViewController拿到數(shù)據(jù):\(jsonData)")
            weakself?.view.backgroundColor = UIColor.redColor()
        }

       /*
       解決方法二: 推薦使用該方式
       swift 特有寫法宿礁,在參數(shù)jsonData前面加上 [weak self]
       注意使用也是self? 可選類型,系統(tǒng)自動解包
      */
        tools.loadData {[weak self] (jsonData) -> () in
            // print("在ViewController拿到數(shù)據(jù):\(jsonData)")
            self?.view.backgroundColor = UIColor.redColor()
        }
    }
  • swift 中的 dellloc
// deinit相當(dāng)OC中的dealloc方法,當(dāng)對象銷毀時會調(diào)用該函數(shù)
    deinit {
        print("ViewController -- deinit")
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末剑梳,一起剝皮案震驚了整個濱河市乃沙,隨后出現(xiàn)的幾起案子熬甫,更是在濱河造成了極大的恐慌猎塞,老刑警劉巖试读,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異荠耽,居然都是意外死亡钩骇,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來倘屹,“玉大人银亲,你說我怎么就攤上這事∨Τ祝” “怎么了务蝠?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長哄辣。 經(jīng)常有香客問我请梢,道長,這世上最難降的妖魔是什么力穗? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮气嫁,結(jié)果婚禮上当窗,老公的妹妹穿的比我還像新娘。我一直安慰自己寸宵,他們只是感情好崖面,可當(dāng)我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著梯影,像睡著了一般巫员。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上甲棍,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天简识,我揣著相機與錄音,去河邊找鬼感猛。 笑死七扰,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的陪白。 我是一名探鬼主播颈走,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼咱士!你這毒婦竟也來了立由?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤序厉,失蹤者是張志新(化名)和其女友劉穎锐膜,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體脂矫,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡枣耀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片捞奕。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡牺堰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出颅围,到底是詐尸還是另有隱情伟葫,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布院促,位于F島的核電站筏养,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏常拓。R本人自食惡果不足惜渐溶,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望弄抬。 院中可真熱鬧茎辐,春花似錦、人聲如沸掂恕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽懊亡。三九已至依啰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間店枣,已是汗流浹背速警。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留艰争,地道東北人坏瞄。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像甩卓,于是被迫代替她去往敵國和親鸠匀。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,515評論 2 359

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