Swift'de tamamlama işleyicisiyle nasıl işlev oluşturabilirim?


Yanıtlar:


174

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.


2
Bu harika çalışırdı, ama daha çok meraktan, işlevinize bir şekilde bir tamamlama işleyicisi yazıp yazamayacağınızı merak ediyordum.
traw1233

1
Merhaba Floks, bu CompletionHandler'ı başka bir işlevden çağırmak istiyorum, bu yüzden bunu nasıl başarabilirim?
Himanshu jamnani

c hedefi için herhangi bir örnek
Xcodian Solangi

Başka bir sınıfla çağırdığımda, tamamlama işleyicisi başarı parametresini ekmiyor.
Chandni

86

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!


80

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")
    }
})

12

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 .

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


5

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 !!


0

Ö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 codehala uyumsuz ran edilecektir. Neden kodları doğruca olmaz let flag = trueve completion Handler(success: flag)bitirilmesi için indirme kodu beklemeden?


Sonunda, kodun çalışması için bir şeyin oturması ve beklemesi gerekir, bu, asenkron fillerden oluşan dev bir kule değildir. "Eşzamansız çalıştırıldı", iki iş parçacığı olduğu anlamına gelir. Biri oturur işin yapılmasını bekler, diğeri devam eder ve yapmaz. Tamamlama işleyicisi, işi yapan iş parçacığının sonunda çağrılır veya en azından çağrılmak üzere programlanır.
Crowman

0

Yukarıdakilere ek olarak: İzleyen kapatma kullanılabilir.

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

  // When download completes,control flow goes here.
  if success {
      // download success
  } else {
    // download fail
  }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.