我正在尝试从网址获取图片并将其应用于按钮。由于某些原因,这首先不起作用,但是第二次加载视图控制器时图像显示出来。它似乎可以缓存它,然后从缓存中获取它,但不能从URL显示它,只能从缓存中显示它,它会出现。这是代码,我从Firebase获取图片。
DataService.ds.REF_USERS.child(self.loggedInUserId!).observeEventType(.Value, withBlock: { userDictionary in
let userDict = userDictionary.value as! NSDictionary
let profileThumbUrl = userDict.objectForKey("profileThumbUrl") as! String
self.button.imageView!.contentMode = UIViewContentMode.ScaleAspectFill
let profileThumbImage = UIImageView()
if profileThumbUrl != "" {
profileThumbImage.loadImageUsingCacheWithUrlString(profileThumbUrl)
self.button.setImage(profileThumbImage.image, forState: .Normal)
} else {
self.button.setImage(UIImage(named: "defaultUserSmall"), forState: .Normal)
}
})
我用来从url获取图像并缓存它或从缓存加载的函数如下所示。我在应用程序的其他地方使用它并且它工作正常,但是当我尝试在此按钮上使用它时,它似乎没有显示它从URL加载,但它缓存它并将从缓存中显示它:
var imageCache = NSMutableDictionary()
extension UIImageView {
func loadImageUsingCacheWithUrlString(urlString: String) {
self.image = nil
if let img = imageCache.valueForKey(urlString) as? UIImage{
self.image = img
}
else{
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithURL(NSURL(string: urlString)!, completionHandler: { (data, response, error) -> Void in
if(error == nil){
if let img = UIImage(data: data!) {
imageCache.setValue(img, forKey: urlString) // Image saved for cache
dispatch_async(dispatch_get_main_queue(), { () -> Void in
self.image = img
})
}
}
})
task.resume()
}
}
}
答案 0 :(得分:1)
好的,所以我必须解决这个问题的方法是在先前的视图控制器中加载图像,然后将其发送到GlobalSingleton,并在加载视图时准备好。我不是真的喜欢这样做,因为你不能总是这样做,它只是在我的情况下工作。所以我希望有人能为其他人更好地回答这个问题!