2016-11-19 5 views
1

Я новичок прошивку я хочу скачать изображение, чтобы отобразить его рабочий код, но здесь много дублирования кодаКак скачать изображение из Интернета?

let url = URL(string: iteminfo.imageUrl!) 
    let urlRequest = URLRequest(url: url!) 
    let task = URLSession.shared.dataTask(with: urlRequest) { (data, response, error) in 
     if error != nil { 
      print(error) 
     } 
     if let data = data { 
      print(data) 
      self.imageViewItemPic.image = UIImage(data: data) 
     } 
    } 
    task.resume() 
    let url2 = URL(string: iteminfo.cookerProfilePicUrl!) 
    let urlRequest2 = URLRequest(url: url2!) 
    let task2 = URLSession.shared.dataTask(with: urlRequest2) { (data, response, error) in 
     if error != nil { 
      print(error) 
     } 
     if let data = data { 
      print(data) 
      self.imageViewCookerProfilePic.image = UIImage(data: data) 
     } 
    } 
    task2.resume() 

Так что я хочу, чтобы повторно использовать мой код, но я, к сожалению, я не могу достичь своей цели. ошибок нет, а URL-адрес правильный. каждый раз идет другое утверждение. я что-то упускаю, но что это?

 if let image = downlaodImage(urlImage: iteminfo.imageUrl){ 
      print("first \(image)") 
       imageViewItemPic.image = image 

     }else{ 
      print("first wrong......") 
     } 
     if let image = downlaodImage(urlImage: iteminfo.cookerProfilePicUrl){ 
      print("second \(image)") 
      imageViewCookerProfilePic.image = image 
     } 
     else{ 
      print("second wrong......") 
     } 

Вот мой метод:

func downlaodImage(urlImage : String?) -> UIImage?{ 
     var image : UIImage? 
     let url = URL(string: urlImage!) 
     let urlRequest = URLRequest(url: url!) 

     let task = URLSession.shared.dataTask(with: urlRequest) { (data, response, error) in 

      if let data = data { 
       // print(data) 

      image = UIImage(data: data) 


      } 
     } 
     task.resume() 
     return image 
    } 

Примечание: Я не уверен, что это лучший способ или нет. если это не лучшая практика, не стесняйтесь направлять меня.

ответ

1

Там нет необходимости так много хлопот. У вас есть URL изображения, поэтому вы можете просто скачать изображение из URL. Например:

func downloadImage(imageURL: String) { 

    DispatchQueue.global().async { 

     let data = NSData.init(contentsOf: NSURL.init(string: imageURL) as! URL) 
     DispatchQueue.main.async { 

      let image = UIImage.init(data: data as! Data) 
      imageView.image = image 
     } 
    } 
} 

Edit: Чтобы повторно использовать этот код, который я хотел бы предложить использовать расширение UIImageView.Вот пример:

extension UIImageView { 

    func setImageFromURL(url: String) { 

     DispatchQueue.global().async { 

      let data = NSData.init(contentsOf: NSURL.init(string: url) as! URL) 
      DispatchQueue.main.async { 

       let image = UIImage.init(data: data as! Data) 
       self.image = image 
      } 
     } 
    } 
} 

Используйте этот метод, когда вы хотите установить образ imageView из url вроде этого:

self.imageViewCookerProfilePic.setImageFromURL(url: "https://encrypted-tbn1.gstatic.com/images?q=tbn:ANd9GcQNpKmjx1w3DRDZ9IXN81-uhSUA6qL6obkOthoUkb9RZkXf5pJ8") 
+0

. Можете ли вы проверить мой вопрос, пожалуйста. Я обновил свой код –

+0

, вы проверили библиотеку [SDWebImage] (https://github.com/rs/SDWebImage)? – Adeel

+0

нет сэр. не возможно без третьей стороны –

0

Чувак. Вы должны изучить некоторые сотрудники о асинхронном и синхронизирующем коде. Вот что. Код в вас downloadImage работает синхронно, поэтому он передает вам URLTask и идите прямо, чтобы вернуться, там вы возвращаете переменную image, то есть ноль. Одним из решений в для использования обратного вызова блока, как это:

func downloadImage(urlImage : String?, complete: ((UIImage?)->Void)? = nil){ 

    let url = URL(string: urlImage!) 
    let urlRequest = URLRequest(url: url!) 
    let task = URLSession.shared.dataTask(with: urlRequest) { (data, response, error) in 

     if let data = data { 
      complete?(UIImage(data: data)) 
     } 
    } 
    task.resume() 
} 

И затем использовать его как это:

{ ... 
     downloadImage(urlImage: "", complete: { image in 
      if let image = image{ 
       self.imageViewItemPic.image = image 
      }else{ 
       print("no image") 
      } 
     }) 
     ... 
    } 

Вы должны прочитать некоторые учебники о асинхронном кода и веб-Свифт. Вы могли бы начать с этим site

+0

могли бы вы проверить мой вопрос, пожалуйста .. Я обновил свой код –

0

downlaodImage() загружает изображение асинхронно так

if let image = downlaodImage(...) { ... }

всегда будет не потому, что выполнение программы продолжается до того ваши данные ответа вернулись.

Было бы проще просто установить изображения в функции обратного вызова downlaodImage(), как показано ниже, добавив параметр UIImageView в downlaodImage(). Таким образом, вы можете уменьшить повторение блоков if else, переместив их в функцию downlaodImage.

func downlaodImage(urlImage : String?, imageView: UIImageView) -> UIImage?{ 
    var image : UIImage? 
    let url = URL(string: urlImage!) 
    let urlRequest = URLRequest(url: url!) 

    let task = URLSession.shared.dataTask(with: urlRequest) { (data, response, error) in 

     if let data = data { 
      // print(data) 

     if let image = UIImage(data: data) { 
      imageView.image = image 
     } else { 
      print("failed to load image") 
     } 





     } 
    } 
    task.resume() 
    return image 
} 

Упрощенный код без если/другое блоки

downlaodImage(urlImage: "https://encrypted-tbn1.gstatic.com/images?q=tbn:ANd9GcQNpKmjx1w3DRDZ9IXN81-uhSUA6qL6obkOthoUkb9RZkXf5pJ8", imageView: imageViewItemPic) 

downlaodImage(urlImage: "https://www.dominos.co.nz/ManagedAssets/OLO/eStore/all/Product/NZ/P015/P015_ProductImage_Small_en_Default_20140203_105245.png", imageView: imageViewCookerProfilePic) 
+0

мог вы проверяете мой вопрос, пожалуйста. Я обновил свой код –

Смежные вопросы