2015-05-22 15 views
63

Ero solo curioso di come avrei affrontato questo. Se avessi una funzione, e volevo che succedesse qualcosa quando era completamente eseguita, come dovrei aggiungerla alla funzione? GrazieCome posso creare una funzione con un gestore di completamento in Swift?

+2

C'è un incredibile video su 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 –

risposta

110

Supponiamo che tu disponga di una funzione di download per scaricare un file dalla rete e desideri ricevere una notifica al termine dell'attività di download.

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

Spero che sia d'aiuto. : -]

+2

Questo grande lavoro, ma più per curiosità, ho mi stavo chiedendo se in qualche modo potresti scrivere un gestore di completamento nella tua funzione. – traw1233

+0

Ciao Floks, Voglio chiamare questo CompletionHandler da un'altra funzione, quindi come ottenere questo ?? –

1

Sono un po 'confuso su gestori di completamento personalizzati. Nel tuo esempio:

Supponiamo che tu disponga di una funzione di download per scaricare un file dalla rete e desideri ricevere una notifica al termine dell'attività di download.

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

tuo // download code sarà ancora correva in modo asincrono. Perché il codice non dovrebbe passare direttamente al tuo let flag = true e completion Handler(success: flag) senza attendere il completamento del tuo codice di download?

+0

Alla fine, qualcosa deve sedersi e aspettare che il codice venga eseguito, non è una torre gigante di elefanti asincroni fino in fondo. "Ran asincronicamente" significa che ci sono due thread. Uno di loro si siede e aspetta che il compito sia svolto, l'altro continua e non lo fa. Il gestore di completamento viene chiamato, o almeno programmato per essere chiamato, alla fine del thread che esegue il lavoro. –

9

Possiamo utilizzare Chiusure per questo scopo. Prova il seguente

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

Ad un certo punto possiamo chiamare questa funzione come indicato di seguito.

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

prega di fare riferimento al seguente link per ulteriori informazioni riguardanti Chiusure.

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

0

Oltre a quanto sopra: chiusura trascinamento può essere utilizzato.

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

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

Ho avuto problemi a capire le risposte, quindi presumo che qualsiasi altro principiante come me possa avere lo stesso problema di me.

La mia soluzione è la stessa della risposta migliore, ma si spera un po 'più chiara e facile da capire per i principianti o le persone che hanno difficoltà a comprendere in generale.

Per creare una funzione con un gestore di completamento

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

    print("Doing something!") 

    finished() 

} 

di utilizzare la funzione di

 override func viewDidLoad() { 

      yourFunctionName { 

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

    } 

L'output sarà

Doing something 
Tada!!! 

Spero che questo aiuti!

+0

Grazie per aver dedicato del tempo per fornire questa risposta. L'ho capito ed è stato in grado di implementarlo con successo. – Jazzmine

28

Simple Swift 4.0 Esempio:

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

come usarlo:

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