重写后从文件加载图像 - UIImage

时间:2017-01-04 16:57:57

标签: ios swift uiimageview uiimage nsfilemanager

我从文件加载图片时遇到了愚蠢的问题。我有两个视图推荐给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")!
}

2 个答案:

答案 0 :(得分:0)

我无法发表评论,但我遇到了类似问题,但我有一个问题,图片是在用户更改标签之前上传还是之后?即使您调用该函数来更新数据库,实际上也需要一些时间来将照片的新照片/路径发送到数据库"。以下是您的选择,如果在切换选项卡时图片不在服务器中,则在成功上载之前实施加载ui并将新的更新值实施到数据库中。一种简单的方法是使用SVProgressHUD窗格并将默认掩码类型设置为.clear,这会禁用用户交互。选项2,是通过静态变量传递实际的UIImage,或者在准备segue方法,或通过结构,或任何其他方式传递实际UIImage,并将需要刷新的图片设置为uiimage而不从服务器获取当你切换标签时。

答案 1 :(得分:0)

哦,我找到了答案。问题在于初始化UIImage。我们有两种从文件加载图像的方法。

首先加载图像并将其缓存在内存中。稍后它只在内存中使用对此图像数据的引用:

let image = UIImage(named: savePath)

每次用户使用该功能时,第二种方法严格地从文件加载图像:

let image = UIImage(contentsOfFile: savePath)

现在它完美无缺:D