2015-05-22 15 views
63

Byłem po prostu ciekawy, jak do tego podejdę. Gdybym miał jakąś funkcję i chciałbym, aby coś się wydarzyło, gdy zostanie ona w pełni wykonana, w jaki sposób dodaję to do funkcji? DziękiJak mogę utworzyć funkcję z obsługą zakończenia w Swift?

+2

Jest niesamowity film na Youtube: https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source= web & cd = 4 & ved = 0ahUKEwic45WLpN7MAhXJ1CYKHUzKDb8QtwIIMDAD & url = https% 3A% 2F% 2Fwww.youtube.com% 2Fwatch% 3Fv% 3DeoP6yYnlI9Y & usg = AFQjCNFjK7cX7BMh7AkeSrIkaAdAGvjatg & sig2 = 0zbt0TJOzM0GcXYZ6Xv2OA & bvm = bv.122129774, d.eWE & cad = RJT –

Odpowiedz

110

Powiedz, że masz funkcję pobierania, aby pobrać plik z sieci i chcesz otrzymywać powiadomienia po zakończeniu pobierania.

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

Mam nadzieję, że to pomaga. : -]

+2

byłoby doskonale, ale bardziej z ciekawości zastanawiałeś się, czy mógłbyś w jakiś sposób napisać do swojej funkcji obsługę zakończenia. – traw1233

+0

Hi Floks, Chcę nazwać ten komunikat CompletionHandler z innej funkcji, więc jak to osiągnąć? –

1

Jestem trochę zdezorientowany, jeśli chodzi o niestandardowe programy obsługi ukończenia. W twoim przykładzie:

Powiedz, że masz funkcję pobierania, aby pobrać plik z sieci i chcesz otrzymywać powiadomienia po zakończeniu pobierania.

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

Twój // download code nadal będzie prowadził asynchronicznie. Dlaczego kod nie powinien przechodzić od razu do telefonu let flag = true ani completion Handler(success: flag) bez czekania na zakończenie pobierania kodu?

+0

W końcu coś musi usiąść i czekać na uruchomienie kodu, to nie jest gigantyczna wieża asynchronicznych słoni w dół. "Asynchroniczny przebieg" oznacza, że ​​istnieją dwa wątki. Jeden z nich siedzi i czeka na wykonanie zadania, a drugi wykonuje i nie robi. Procedura obsługi zakończenia zostanie wywołana, lub przynajmniej zaplanowana, aby zostać wywołana, na końcu wątku, który wykonuje pracę. –

9

Możemy użyć do tego celu Zamknięcia. Spróbuj następującą

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

w pewnym momencie możemy wywołać tę funkcję, jak podano poniżej.

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

Patrz na poniższy link, aby uzyskać więcej informacji na temat Zamknięcia.

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

0

Oprócz powyżej: Końcowe zamknięcie mogą być użyte.

31

Miałem problemy ze zrozumieniem odpowiedzi, więc zakładam, że każdy inny początkujący, jak ja, może mieć taki sam problem jak ja.

Moje rozwiązanie działa tak samo, jak najlepsza odpowiedź, ale mam nadzieję, że jest ono nieco bardziej przejrzyste i łatwe do zrozumienia dla początkujących lub osób mających problemy ze zrozumieniem.

Aby utworzyć funkcję z obsługi realizacji

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

    print("Doing something!") 

    finished() 

} 

korzystać z funkcji

 override func viewDidLoad() { 

      yourFunctionName { 

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

    } 

Twój wynik będzie

Doing something 
Tada!!! 

Nadzieja to pomaga!

+0

Dziękujemy za poświęcenie czasu na udzielenie tej odpowiedzi. Zrozumiałem to i udało mi się go z powodzeniem wdrożyć. – Jazzmine

28

Simple Swift 4.0 Przykład:

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

Jak go używać:

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") 
    } 
}) 
Powiązane problemy