Il y a plusieurs choses avec votre code tel qu'il est :
- Vous utilisez beaucoup de moulage, ce qui n'est pas nécessaire.
- Vous traitez votre URL comme une URL de fichier local, ce qui n'est pas le cas.
- Vous ne téléchargez jamais l'URL qui sera utilisée par votre image.
La première chose que nous allons faire est de déclarer votre variable en tant que let
car nous n'avons pas l'intention de le modifier ultérieurement.
let catPictureURL = URL(string: "http://i.imgur.com/w5rkSIj.jpg")! // We can force unwrap because we are 100% certain the constructor will not return nil in this case.
Ensuite, nous devons télécharger le contenu de cette URL. Nous pouvons le faire avec la fonction URLSession
objet. Lorsque le gestionnaire d'achèvement est appelé, nous aurons un objet UIImage
téléchargés sur le web.
// Creating a session object with the default configuration.
// You can read more about it here https://developer.apple.com/reference/foundation/urlsessionconfiguration
let session = URLSession(configuration: .default)
// Define a download task. The download task will download the contents of the URL as a Data object and then you can do what you wish with that data.
let downloadPicTask = session.dataTask(with: catPictureURL) { (data, response, error) in
// The download has finished.
if let e = error {
print("Error downloading cat picture: \(e)")
} else {
// No errors found.
// It would be weird if we didn't have a response, so check for that too.
if let res = response as? HTTPURLResponse {
print("Downloaded cat picture with response code \(res.statusCode)")
if let imageData = data {
// Finally convert that Data into an image and do what you wish with it.
let image = UIImage(data: imageData)
// Do something with your image.
} else {
print("Couldn't get image: Image is nil")
}
} else {
print("Couldn't get response code for some reason")
}
}
}
Enfin, vous devez appeler resume
sur la tâche de téléchargement, sinon votre tâche ne démarrera jamais :
downloadPicTask.resume()
.
Tout ce code peut sembler un peu intimidant au premier abord, mais la URLSession
Les API sont basées sur des blocs, ce qui leur permet de fonctionner de manière asynchrone. Si vous bloquez votre thread d'interface utilisateur pendant quelques secondes, le système d'exploitation mettra fin à votre application.
Votre code complet devrait ressembler à ceci :
let catPictureURL = URL(string: "http://i.imgur.com/w5rkSIj.jpg")!
// Creating a session object with the default configuration.
// You can read more about it here https://developer.apple.com/reference/foundation/urlsessionconfiguration
let session = URLSession(configuration: .default)
// Define a download task. The download task will download the contents of the URL as a Data object and then you can do what you wish with that data.
let downloadPicTask = session.dataTask(with: catPictureURL) { (data, response, error) in
// The download has finished.
if let e = error {
print("Error downloading cat picture: \(e)")
} else {
// No errors found.
// It would be weird if we didn't have a response, so check for that too.
if let res = response as? HTTPURLResponse {
print("Downloaded cat picture with response code \(res.statusCode)")
if let imageData = data {
// Finally convert that Data into an image and do what you wish with it.
let image = UIImage(data: imageData)
// Do something with your image.
} else {
print("Couldn't get image: Image is nil")
}
} else {
print("Couldn't get response code for some reason")
}
}
}
downloadPicTask.resume()
0 votes
La deuxième ligne renvoie nil.
0 votes
Pourquoi n'utilisez-vous pas directement l'URL dans la première ligne au lieu d'utiliser NSURL pour le couler plus tard ?
0 votes
Je n'ai pas bien vu ce que vous essayiez de faire tout à l'heure. Je vais écrire une réponse appropriée maintenant.