簡體   English   中英

重寫后從文件加載圖像-UIImage

[英]Load image from the file after rewrite it - UIImage

我從文件加載圖像時遇到了愚蠢的問題。 我對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")!
}

我無法發表評論,但是我遇到了類似的問題,但是我有一個問題,在用戶更改標簽之前還是之后,圖片是否上傳了? 即使調用該函數來更新數據庫,實際上也要花費一些時間“將新照片/照片的路徑發送到數據庫”。 這是您的選擇,如果在切換選項卡時圖片不在服務器中,請執行加載ui,直到圖片成功上傳並將新的更新值添加到數據庫中為止。 一種簡單的方法是使用SVProgressHUD pod並將默認掩碼類型設置為.clear ,這將禁用用戶交互。 選項2是通過靜態變量,通過prepare for segue方法,通過struct或任何其他方式傳遞實際的UIImage並將需要刷新的圖片設置為uiimage而不是僅從服務器獲取它切換標簽時。

Okey,我找到了答案。 問題出在初始化UIImage。 我們有兩種從文件加載圖像的方法。

第一個加載圖像並將其緩存在內存中。 以后,它僅使用對內存中此圖像數據的引用:

let image = UIImage(named: savePath)

第二種方法是每次用戶使用該功能時都嚴格從文件加載圖像:

let image = UIImage(contentsOfFile: savePath)

現在,它可以完美運行:D

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM