Swift基礎2.1——閉包

在之前一篇關於block的總結中,也提到過,閉包與 OC 中的 Block 類似,閉包主要用於異步操作執行完成後的代碼回調,網絡訪問結果以參數的形式傳遞給調用方。

閉包的定義

  • 定義一個閉包
    • 閉包 = { (行參) -> 返回值 in // 代碼實現 }
    • in 用於區分函數定義和代碼實現
//: 閉包 = { (行參) -> 返回值 in // 代碼實現 }
let sumFunc = { (num1 x: Int, num2 y: Int) -> Int in
    return x + y
}
sumFunc(num1: 10, num2: 20)
  • 閉包格式小結
// 格式: let 閉包名: (形參) -> 返回類型 = { (形參1, 形參2, ...) in 代碼實現 }
// 說明: 使用形參列表,可以直接提供外部參數
//
// 格式: let 閉包名: (形參類型) -> 返回類型 = { (形參1, 形參2, ...) in 代碼實現 }
//
// 格式: { (外部參數1 形參1, 外部參數2 形參2, ...) -> 返回類型 in 代碼實現 }
// 說明: 使用外部參數會方便調用
//
// 格式: { (形參列表) -> 返回類型 in 代碼實現 }
最簡單的閉包,如果沒有參數/返回值,則 參數/返回值/in 統統都可以省略

let demoFunc = {
    print("hello")
}

基本使用

GCD 異步

  • 模擬在後臺線程加載數據
func loadData() {
    dispatch_async(dispatch_get_global_queue(0, 0), { () -> Void in
        print("耗時操作 \(NSThread .currentThread())")
    })
}
  • 尾隨閉包,如果閉包是最後一個參數,可以用以下寫法
  • 注意上下兩段代碼,} 的位置
func loadData() {
    dispatch_async(dispatch_get_global_queue(0, 0)) { () -> Void in
        print("耗時操作 \(NSThread .currentThread())")
    }
}
  • 閉包的簡寫,如果閉包中沒有參數和返回值,可以省略
func loadData() {
    dispatch_async(dispatch_get_global_queue(0, 0)) {
        print("耗時操作 \(NSThread .currentThread())")
    }
}

自定義閉包參數,實現主線程回調

  • 添加沒有參數,沒有返回值的閉包
override func viewDidLoad() {
    super.viewDidLoad()

    loadData {
        print("完成回調")
    }
}

// MARK: - 自定義閉包參數
func loadData(finished: ()->()) {

    dispatch_async(dispatch_get_global_queue(0, 0)) {
        print("耗時操作 \(NSThread.currentThread())")

        dispatch_sync(dispatch_get_main_queue()) {
            print("主線程回調 \(NSThread.currentThread())")

            // 執行回調
            finished()
        }
    }
}
  • 添加回調參數
override func viewDidLoad() {
    super.viewDidLoad()

    loadData4 { (html) -> () in
        print(html)
    }
}

/// 加載數據
/// 完成回調 - 傳入回調閉包,接收異步執行的結果
func loadData4(finished: (html: String) -> ()) {

    dispatch_async(dispatch_get_global_queue(0, 0)) {
        print("加載數據 \(NSThread.currentThread())")

        dispatch_sync(dispatch_get_main_queue()) {
            print("完成回調 \(NSThread.currentThread())")

            finished(html: "<h1>hello world</h1>")
        }
    }
}

關於閉包的循環引用,與block完全一致,在另一篇博客中有介紹。具體參看下屬鏈接。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章