Bagaimana saya bisa membuat fungsi dengan penangan penyelesaian di Swift?


117

Saya hanya ingin tahu bagaimana saya akan melakukan ini. Jika saya memiliki sebuah fungsi, dan saya ingin sesuatu terjadi ketika itu dijalankan sepenuhnya, bagaimana cara menambahkan ini ke dalam fungsi? Terima kasih


2
Ada video yang luar biasa di Youtube: google.com/…
Bright Future

Jawaban:


174

Katakanlah Anda memiliki fungsi download untuk mendownload file dari jaringan, dan ingin diberi tahu saat tugas download telah selesai.

typealias CompletionHandler = (success:Bool) -> Void

func downloadFileFromURL(url: NSURL,completionHandler: CompletionHandler) {

    // download code.

    let flag = true // true if download succeed,false otherwise

    completionHandler(success: flag)
}

// How to use it.

downloadFileFromURL(NSURL(string: "url_str")!, { (success) -> Void in

    // When download completes,control flow goes here.
    if success {
        // download success
    } else {
        // download fail
    }
})

Semoga membantu.


2
Ini akan bekerja dengan baik, tetapi lebih karena penasaran, saya bertanya-tanya apakah Anda entah bagaimana bisa menulis penangan penyelesaian ke dalam fungsi Anda.
traw1233

1
Hai Floks, saya ingin memanggil CompletionHandler ini dari fungsi lain jadi bagaimana cara mencapai ini ??
Himanshu jamnani

contoh apapun untuk objektif c
Xcodian Solangi

Ketika saya memanggilnya oleh kelas lain itu tidak menabur parameter keberhasilan penanganan penyelesaian.
Chandni

86

Saya kesulitan memahami jawabannya, jadi saya berasumsi bahwa pemula lain seperti saya mungkin memiliki masalah yang sama dengan saya.

Solusi saya melakukan hal yang sama seperti jawaban atas tetapi semoga sedikit lebih jelas dan mudah dipahami untuk pemula atau orang yang hanya mengalami kesulitan memahami secara umum.

Untuk membuat fungsi dengan penangan penyelesaian

func yourFunctionName(finished: () -> Void) {

     print("Doing something!")

     finished()

}

untuk menggunakan fungsi tersebut

     override func viewDidLoad() {

          yourFunctionName {

          //do something here after running your function
           print("Tada!!!!")
          }

    }

Output Anda akan

Melakukan sesuatu

Tada !!!

Semoga ini membantu!


80

Contoh Swift 4.0 sederhana:

func method(arg: Bool, completion: (Bool) -> ()) {
    print("First line of code executed")
    // do stuff here to determine what you want to "send back".
    // we are just sending the Boolean value that was sent in "back"
    completion(arg)
}

Bagaimana cara menggunakannya:

method(arg: true, completion: { (success) -> Void in
    print("Second line of code executed")
    if success { // this will be equal to whatever value is set in this method call
          print("true")
    } else {
         print("false")
    }
})

12

Kita bisa menggunakan Closures untuk tujuan ini. Coba berikut ini

func loadHealthCareList(completionClosure: (indexes: NSMutableArray)-> ()) {
      //some code here
      completionClosure(indexes: list)
}

Di beberapa titik kita dapat memanggil fungsi ini seperti yang diberikan di bawah ini.

healthIndexManager.loadHealthCareList { (indexes) -> () in
            print(indexes)
}

Silakan lihat tautan berikut untuk informasi lebih lanjut tentang Penutupan .

https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html


5

Swift 5.0 +, Sederhana dan Pendek

contoh:

Gaya 1

    func methodName(completionBlock: () -> Void)  {

          print("block_Completion")
          completionBlock()
    }

Gaya 2

    func methodName(completionBlock: () -> ())  {

        print("block_Completion")
        completionBlock()
    }

Menggunakan:

    override func viewDidLoad() {
        super.viewDidLoad()
        
        methodName {

            print("Doing something after Block_Completion!!")
        }
    }

Keluaran

block_Completion

Melakukan sesuatu setelah Block_Completion !!


0

Saya sedikit bingung tentang penangan penyelesaian yang dibuat khusus. Dalam contoh Anda:

Katakanlah Anda memiliki fungsi unduh untuk mengunduh file dari jaringan, dan ingin diberi tahu ketika tugas unduhan telah selesai.

typealias CompletionHandler = (success:Bool) -> Void

func downloadFileFromURL(url: NSURL,completionHandler: CompletionHandler) {

    // download code.

    let flag = true // true if download succeed,false otherwise

    completionHandler(success: flag)
}

Anda // download codeakan tetap dijalankan secara asinkron. Mengapa kode tidak langsung masuk ke Anda let flag = truedan completion Handler(success: flag)tanpa menunggu kode unduhan Anda selesai?


Akhirnya, sesuatu harus duduk dan menunggu kode dijalankan, itu bukan menara raksasa gajah asinkron di sepanjang jalan. "Dijalankan secara asynchronous" berarti ada dua utas. Salah satu dari mereka duduk dan menunggu tugas selesai, yang lain melanjutkan dan tidak. Penangan penyelesaian dipanggil, atau setidaknya dijadwalkan untuk dipanggil, di akhir utas yang melakukan pekerjaan.
Crowman

0

Selain di atas: Penutupan jejak dapat digunakan.

downloadFileFromURL(NSURL(string: "url_str")!)  { (success) -> Void in

  // When download completes,control flow goes here.
  if success {
      // download success
  } else {
    // download fail
  }
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.