Quelqu'un peut-il expliquer pourquoi l'achèvement retourne tableau vide?retour de la fonction trop tôt
La fonction:
import Foundation
class IMBD{
func searchMovies(searchText:String, completion: (result: [Movies]) -> Void){
var movies = [Movies]()
let replacedMovieTitle = searchText.stringByReplacingOccurrencesOfString(" ", withString: "+")
let URLString = "http://www.omdbapi.com/?s=\(replacedMovieTitle)&y=&r=json"
let URL = NSURL(string: URLString)
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithURL(URL!, completionHandler: {(data, response, error) -> Void in
do{
let jsonData = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as! NSDictionary
if let search = jsonData["Search"] as? [[String : AnyObject]]{
for hit in search{
guard let title = hit["Title"] as? String else{
print("returna title")
return
}
guard let year = hit["Year"] as? String else{
print("returna year")
return
}
guard let imbdID = hit["imdbID"] as? String else{
print("returna imbd")
return
}
guard let poster = hit["Poster"] as? String else{
print("returna poster")
return
}
let movie = Movies(title: title, released: year, poster: poster, imbdID: imbdID)
movies.append(movie)
}
}
}catch{
}
}).resume()
completion(result: movies)
}
}
L'appel:
imbd.searchMovies(searchtext!, completion: { (result) -> Void in
self.movieList = result
})
Merci! Cela a fonctionné :) Où devrais-je mettre l'expédition ?? –
@ AsleBenjaminKinnerød - Voir l'extrait de code dans la réponse révisée. – Rob
Le point 6 est discutable: la décision d'exécuter le code à l'intérieur du completionhandler doit être prise par l'appelant, le destinataire ne sait pas si le code dans le completionblock doit être appelé sur un thread spécifique. Il se pourrait que les résultats ne soient analysés, aucune interface utilisateur impliquée. Dans ce cas, pas besoin d'envoyer à la file d'attente principale du tout. En général, les utilisateurs d'API impliquant des gestionnaires d'achèvement doivent supposer que l'achèvement exécute un thread arbitraire. L'expédition devrait être à l'intérieur du bloc. – Joride