我从文件加载图片时遇到了愚蠢的问题。我有两个视图推荐给UITabBarController。
在第一个视图中,用户可以从照片库或相机加载他的图像。第二个视图显示这张照片。此文件位于服务器上。如果用户没有选择他的图像服务器发送自定义图像。如果有上传的照片,它会推送用户的照片。
当用户点按按钮时,会出现一个带有选项的菜单。例如,我们将决定从照片库中拍照。用户拍摄图像后:
func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage!, editingInfo: [NSObject : AnyObject]!) {
self.saveUserImage(userID, imageData: UIImagePNGRepresentation(image)!)
apiManager.userUploadProfile(userID, imageData: UIImagePNGRepresentation(image)!)
userImageView.image = image
}
func saveUserImage(userUUID: String, imageData: NSData) {
let path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).last
let savePath = path! + "/\(userUUID)-user.png"
NSFileManager.defaultManager().createFileAtPath(savePath, contents: imageData, attributes: nil)
}
在那之后用户可以看到所选择的图片,一切都很好。当用户更改选项卡时,第二个视图将刷新其上的所有数据,并再次从服务器下载所有图像和数据。不幸的是,包含旧用户图像的图像不会刷新,并且仍有旧照片。
当我们回到第一个标签时,图像会回到旧图像,但几秒钟之后。
最奇怪的是,如果我检查服务器有新上传的图像,并且在应用程序容器中也存在。当我重新启动应用程序时,一切都很完美。
看起来这个图像保存在内存中,iOS从RAM或其他交换中获取旧版本。如何刷新UIImageView并显示当前保存的图像?
编辑: 有一种加载图像的方法
func userProfilePicture(userId: String) -> UIImage {
let cacheDirectory = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).last
let savePath = cacheDirectory! + "/\(userId)-user.png"
if NSFileManager.defaultManager().fileExistsAtPath(savePath) {
if let image = UIImage(named: savePath) {
return image
}
}
return UIImage(named: "test_avatar")!
}
答案 0 :(得分:0)
我无法发表评论,但我遇到了类似问题,但我有一个问题,图片是在用户更改标签之前上传还是之后?即使您调用该函数来更新数据库,实际上也需要一些时间来将照片的新照片/路径发送到数据库"。以下是您的选择,如果在切换选项卡时图片不在服务器中,则在成功上载之前实施加载ui并将新的更新值实施到数据库中。一种简单的方法是使用SVProgressHUD窗格并将默认掩码类型设置为.clear
,这会禁用用户交互。选项2,是通过静态变量传递实际的UIImage,或者在准备segue方法,或通过结构,或任何其他方式传递实际UIImage,并将需要刷新的图片设置为uiimage而不从服务器获取当你切换标签时。
答案 1 :(得分:0)
首先加载图像并将其缓存在内存中。稍后它只在内存中使用对此图像数据的引用:
let image = UIImage(named: savePath)
每次用户使用该功能时,第二种方法严格地从文件加载图像:
let image = UIImage(contentsOfFile: savePath)
现在它完美无缺:D