2015-03-21 3 views
0

Я использую API изображения Google, чтобы загрузить изображение, которое будет отображаться пользователю, код работает так:Swift: Загрузка и отображение изображения занимает в 5 раз больше, чем это должно

 downloadImage { [weak self] image in 
     if let strongSelf = self { 
      if let image = image { 
       strongSelf.mainImage.image = image 
      } 
     } 
    } 
} 

func downloadImage(completion: UIImage? -> Void) { 

    let url = NSURL(string: "https://ajax.googleapis.com/ajax/services/search/images?v=1.0&q=anything") 
    let request = NSURLRequest(URL: url!) 


    NSURLConnection.sendAsynchronousRequest(request, queue: self.operationQueue) { [weak self] response, data, error in 
     if let strongSelf = self { 
      if error != nil || data == nil { 
       println(error) 
       completion(nil) 
       return 
      } 

      var serializationError: NSError? 
      if let go = NSJSONSerialization.JSONObjectWithData(data!, options: .AllowFragments, error: &serializationError) as? [String: AnyObject] { 
       let responseData = go["responseData"] as [String:AnyObject] 
       let results = responseData["results"] as [[String:String]] 
       let firstObject = results[0] 
       var firstURL = firstObject["unescapedUrl"]! 
       let theurl = NSURL(string: firstURL) 
       let imageRequest = NSURLRequest(URL: theurl!) 

       NSURLConnection.sendAsynchronousRequest(imageRequest, queue: strongSelf.operationQueue) { response, data, error in 
        if error != nil || data == nil { 
         println(error) 
         completion(nil) 
         return 
        } 

        if let image = UIImage(data: data!) { 
         completion(image) 

        } else { 
         completion(nil) 
        } 
       } 
      } else { 
       println(serializationError) 
       completion(nil) 
      } 
     } 
    } 

Этот в основном просто находит URL-адрес изображения, а затем загружает изображение и устанавливает на это изображение. Однако в большинстве случаев для отображения загруженного изображения требуется mainImage около 20 или 30 секунд, хотя я знаю, что изображение должно быть загружено гораздо быстрее, чем это (если я распечатаю url и найду его в своем браузере, он будет делать он через 3 или 4 секунды, то я буду терпеливо ждать, пока mainImage отобразит его в симуляторе). Также смешно, что если я сохраню url, переключитесь на контроллеры представлений и у нового контроллера просмотра есть переменная изображения, которая загружает изображение URL-адреса, она будет делать это прямо сейчас (например, открывать ее в моем браузере), в то время как главный контроллер представления все равно не загрузится.

ответ

1

Я думаю, проблема в том, что вы не обновляете пользовательский интерфейс в главной очереди. Попробуйте называть это следующим образом:

 downloadImage { [weak self] image in 
     if let strongSelf = self { 
      if let image = image { 
       dispatch_async(dispatch_get_main_queue(), {() -> Void in 
        strongSelf.mainImage.image = image 
       }) 
      } 
     } 
    } 
+0

что было - работает сейчас. – ZhouW

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