Yanıtlar:
Ağdan bir dosya indirmek için bir indirme fonksiyonunuz olduğunu ve indirme görevi bittiğinde bildirim almak istediğinizi varsayalım.
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
}
})
Umarım yardımcı olur.
Cevapları anlamakta güçlük çektim, bu yüzden benim gibi yeni başlayanların da benimle aynı problemi yaşayabileceğini varsayıyorum.
Benim çözümüm en iyi cevapla aynı şeyi yapıyor, ancak umarım yeni başlayanlar veya genel olarak anlamakta güçlük çeken insanlar için biraz daha net ve anlaşılması kolay.
Tamamlama işleyicili bir işlev oluşturmak için
func yourFunctionName(finished: () -> Void) {
print("Doing something!")
finished()
}
işlevi kullanmak
override func viewDidLoad() {
yourFunctionName {
//do something here after running your function
print("Tada!!!!")
}
}
Çıktınız olacak
Bir şeyler yapmak
Tada !!!
Bu yardımcı olur umarım!
Basit Swift 4.0 örneği:
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)
}
Bu nasıl kullanılır:
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")
}
})
Bu amaçla Closures kullanabiliriz . Takip etmeyi dene
func loadHealthCareList(completionClosure: (indexes: NSMutableArray)-> ()) {
//some code here
completionClosure(indexes: list)
}
Bir noktada bu işlevi aşağıda verildiği gibi adlandırabiliriz.
healthIndexManager.loadHealthCareList { (indexes) -> () in
print(indexes)
}
Kapanışlarla ilgili daha fazla bilgi için lütfen aşağıdaki bağlantıya bakın .
Swift 5.0 +, Basit ve Kısa
misal:
Tarzı 1
func methodName(completionBlock: () -> Void) {
print("block_Completion")
completionBlock()
}
Tarzı 2
func methodName(completionBlock: () -> ()) {
print("block_Completion")
completionBlock()
}
kullanın:
override func viewDidLoad() {
super.viewDidLoad()
methodName {
print("Doing something after Block_Completion!!")
}
}
Çıktı
block_Completion
Block_Completion'dan sonra bir şeyler yapmak !!
Özel yapım tamamlama işleyicileri konusunda biraz kafam karıştı. Örneğinizde:
Ağdan bir dosya indirmek için bir indirme fonksiyonunuz olduğunu ve indirme görevi bittiğinde bildirim almak istediğinizi varsayalım.
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)
}
Sizin // download code
hala uyumsuz ran edilecektir. Neden kodları doğruca olmaz let flag = true
ve completion Handler(success: flag)
bitirilmesi için indirme kodu beklemeden?