我正在尝试使用使用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的新手,所以请原谅任何明显的陷阱或语义错误。
答案 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
变量设为可选项,即使可以进一步清理。无论如何,尝试该代码,看看你是否仍然崩溃。