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
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
Jawaban:
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.
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!
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")
}
})
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 .
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 !!
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 code
akan tetap dijalankan secara asinkron. Mengapa kode tidak langsung masuk ke Anda let flag = true
dan completion Handler(success: flag)
tanpa menunggu kode unduhan Anda selesai?