【问题标题】:Load image from the file after rewrite it - UIImage重写后从文件中加载图像 - UIImage
【发布时间】:2017-05-19 01:40:06
【问题描述】:

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

【问题讨论】:

    标签: ios swift uiimageview uiimage nsfilemanager


    【解决方案1】:

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

    【讨论】:

    • 是的,我在上传后下载它,但是当我检查应用程序容器时,其中有新图像。也许我会通过通知刷新所有图像...我应该尝试你的方式:)
    • 让我知道它是否有效,如果它确实接受了答案:P 如果没有,我会继续帮助你。
    • 不幸的是它不起作用。每次我从文件中刷新 UIImageView 时,它都会得到旧图片。
    【解决方案2】:

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

    第一个加载图像并将其缓存在内存中。后来它只在内存中使用了对这个图像数据的引用:

    let image = UIImage(named: savePath)
    

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

    let image = UIImage(contentsOfFile: savePath)
    

    现在它完美运行:D

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-15
      • 1970-01-01
      • 2011-12-26
      • 2014-01-21
      • 1970-01-01
      • 1970-01-01
      • 2017-07-17
      • 2013-06-15
      相关资源
      最近更新 更多