使用Flickr API将图像加载到imageView中

时间:2017-11-02 22:09:58

标签: ios swift xcode

我正在尝试使用使用Flickr的API检索的网址将单个图片加载到imageView

使用以下方法获取照片对象数组:

private func performSearchWithText(searchText: String) {
  UIApplication.shared.isNetworkActivityIndicatorVisible = true
  FlickrProvider.fetchPhotosForSearchText(searchText: searchText, onCompletion: { (error: NSError?, flickrPhotos: [FlickrPhoto]?) -> Void in
    if error == nil {
      self.photos = flickrPhotos!
    } else {
      self.photos = []
      if (error!.code == FlickrProvider.Errors.invalidAccessErrorCode) {
        DispatchQueue.main.async(execute: { () -> Void in
          self.showErrorAlert()
        })
      }
    }

    DispatchQueue.main.async(execute: { () -> Void in
      self.loadImageWithUrl()
    })
  })
}

最后一个方法调用self.loadImageWithUrl()应该通过imageView一个图像加载到pop()

private func loadImageWithUrl() {
  var photo = photos.popLast()
  if photo != nil {
    imageView.sd_setImage(with: photo!.photoUrl.absoluteURL as URL!)
  }
}

照片永远不会加载,我在调试器中收到以下错误:

  

主题1:EXC_BAD_INSTRUCTION(代码= EXC_I386_INVOP,子代码= 0x0)

我是Swift的新手,所以请原谅任何明显的陷阱或语义错误。

1 个答案:

答案 0 :(得分:0)

调试器停在代码中的哪一行?可能导致您的问题的是nil变量,并且它在您的代码中被强制解包。所以,让我们清理一下这段代码吧。

它不安全"假设您将始终从可选项中返回一个值,因此您需要防范nil的可能情况,否则您的应用程序将容易出错。您还希望加载带有图像的imageView,但只有在1)没有错误且2)您有一个数据源从中加载imageView时才会发生这种情况,所以为什么不在封闭内做呢?

private func performSearchWithText(searchText: String) {
    UIApplication.shared.isNetworkActivityIndicatorVisible = true
    FlickrProvider.fetchPhotosForSearchText(searchText: searchText, onCompletion: { (error: NSError?, flickrPhotos: [FlickrPhoto]?) -> Void in
        if let error = error {
            DispatchQueue.main.async {
                self.showErrorAlert()
            }
        } else {
            guard let photos = flickrPhotos else {
                self.photos = []
                return
            }
            self.photos = photos
            DispatchQueue.main.async {
                self.loadImageWithUrl()
            }
        }
    }
}

如果您将photos变量设为可选项,即使可以进一步清理。无论如何,尝试该代码,看看你是否仍然崩溃。