2017-01-15 7 views
-1

Ich benutze Alamofire, um Daten vom Server zu holen und dann in ein Array von CarType Objekte, die CarType ist meine Struktur. Was ich vom Server bekomme, ist name, id und iconUrl. Von iconUrls möchte ich Symbole herunterladen und in icon setzen. Danach verwende ich icon und name in einer Sammlungsansicht. meine Alamofire Anfrage ist:herunterladen Bilder mit alamofire - iOS

var info = [CarType]() 
Alamofire.request(.GET,"url") 
    .responseJSON { response in 
     for (_,subJson):(String, JSON) in json["result"] 
     { 
      let name = subJson["name"].string 
      let iconUrl = subJson["icon"].string 
      let id = subJson["id"].int 
      info.append(CarType(id: id!, name: name!, iconUrl: iconUrl! , image: UIImage())) 
     } 

meine Struktur ist:

import Foundation 
import UIKit 

struct CarType { 
    var name : String 
    var id : Int 
    var iconUrl : String 
    var icon : UIImage 
} 

Ich möchte Bilder herunterladen, bevor sie in Collection verwenden. Wie kann ich Bilder (mit AlamofireImage) herunterladen und in die zugehörige carType-Icon-Eigenschaft einfügen?

Antwort

2

Was Sie fragen, ist wirklich schlechte Übung in der mobilen App. Nur ein Fall, zum Beispiel, Sie haben eine Anfrage gemacht und haben wie 20 Artikel in einem Array, und um alle UIImage s in Ihre Modelle zu setzen, müssen Sie 20 weitere Anfragen machen, auch Sie wissen nicht, ob Ihre Benutzer wird irgendwann diese Icons benutzen oder nicht.

Stattdessen könnten Sie die Bilder holen, wenn die Zelle (ich glaube, werden Sie diese Symbole in einer Zelle werden die Anzeige) angezeigt wird, zu diesem Zweck Sie Libs wie SDWebImage (objective c) oder Kingfisher (swift) verwenden könnte, die haben Erweiterungen für UIImageView, um das Abrufen und Anzeigen von Bildern zu erleichtern. Diese Bibliotheken können das heruntergeladene Bild auch zwischenspeichern.

Auch ein anderer Vorschlag für Objekt-Mapping. Zurzeit ordnen Sie json manuell Ihrem Modell zu. Es gibt eine Menge guter Bibliotheken, die das für Sie erledigen können, was Ihren Objekt-Mapping-Prozess zum Beispiel automatisieren könnte - ObjectMapper

Hope, das war hilfreich. Viel Glück!

1

Ich habe Funktionalitäten Sache in UITableView getan, fügte in CellForRowIndex Verfahren folgende:

getDataFromUrl(urlString){(data,response,error) -> Void in 
        if error == nil { 
         // Convert the downloaded data in to a UIImage object 
         let image = UIImage(data: data!) 
         // Store the image in to our cache 
         if((image) != nil){ 
          // Store the image in to our cache 
          self.imageCacheProfile[urlString] = image 
          // Update the cell 
          DispatchQueue.main.async(execute: { 
           cell.imgvwProfile?.image = image 
          }) 
         } 
         else{ 
          cell.imgvwProfile!.image = UIImage(named: "user") 
         } 
        } 
       } 

func getDataFromUrl(_ strUrl:String, completion: @escaping ((_ data: Data?, _ response: URLResponse?, _ error: NSError?) -> Void)) { 
    let url:URL = URL(string: strUrl)! 
    let request = URLRequest(url: url) 

    URLSession.shared.dataTask(with: request) {data, response, err in 
     print("Entered the completionHandler") 
     }.resume() 

} 

Sie müssen auch Imagecache erklären heruntergeladenen Bilder zu speichern.

Sie können den obigen Code in Ihrer Methode verwenden und es sollte nur funktionieren.

Verwandte Themen