2017-01-04 9 views
0

ファイルからイメージを読み込むのに愚かな問題があります。 UITabBarControllerに2つのビューを配置しました。ファイルを書き直してからイメージをロードする - UIImage

最初のビューでは、ユーザーはフォトライブラリまたはカメラから画像を読み込むことができます。 2番目のビューはこの写真を提示します。このファイルはサーバー上にあります。ユーザーが画像サーバーを選択しなかった場合、カスタム画像が送信されます。アップロードされた写真がある場合、ユーザーの画像がプッシュされます。

ユーザーがタップすると、オプション付きのメニューが表示されます。たとえば、写真ライブラリから写真を撮ることにします。ユーザーが画像を撮影した後:

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) 
} 

この後、ユーザーは選択した画像を見ることができ、すべてがokeyです。ユーザー変更タブでは、2番目のビューですべてのデータが更新され、サーバーからすべてのイメージとデータが再度ダウンロードされます。残念ながら、古いユーザーイメージを含むイメージは更新されず、古いイメージが残っています。

最初のタブ画像に戻ってくると、数秒後に古い画像に戻ります。

私がサーバーをチェックしていると新しいアップロードされた画像があり、それもアプリケーションコンテナに存在します。アプリを再起動すると、すべてが完全に機能します。

このイメージはメモリに保存されていて、iOSは古いバージョンをRAMや他のスワップから取得しているようです。どのようにUIImageViewをリフレッシュし、現在の保存画像を表示しますか?

EDIT: 画像

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

をロードする方法は、私がコメントすることはできませんが、私は同様の問題に直面していたが、私は疑問を持って、ユーザーがタブを変更する前に、写真がアップロードされますんがあります、または後?データベースを更新する関数を呼び出しても、実際には新しい写真/パスをデータベースに送信するには時間がかかります。あなたのオプションがあります。画像が切り替えタブのときにサーバーにない場合は、正常にアップロードされ、新しい更新された値がデータベースにロードされるまで読み込みUIを実装します。簡単な方法は、SVProgressHUDポッドを使用し、デフォルトのマスクタイプを.clearに設定して、ユーザーの操作を無効にすることです。オプション2は、実際のUIImageを静的変数、またはSegueメソッドの準備、構造体、またはその他の方法で渡し、サーバーから取得せずにuiimageに更新する必要のあるピクチャを設定することですタブを切り替えると

+0

はい、アップロード後にダウンロードしていますが、アプリのコンテナを確認しているときに新しい画像が入っています。たぶん私は通知によってすべての画像をリフレッシュします...私はあなたの方法を試してください:) – Dzeremix

+0

もしそれがうまくいけば答えを受け入れたかどうか私に知らせてください:P私はあなたを助け続けるでしょう。 – Timmy

+0

残念ながら、それは動作していません。ファイルからUIImageViewをリフレッシュするたびに、古い画像が取得されます。 – Dzeremix

0

Okey、私は答えを見つけました。問題はUIImageを初期化することにありました。ファイルから画像を読み込むには2つの方法があります。

最初に画像をロードし、メモリにキャッシュします。その後、それがメモリにこのイメージにデータを参照のみを使用します。厳密に

let image = UIImage(named: savePath) 

第二の方法・ロード・イメージをファイルからたびに、ユーザーがその機能を使用する場合:今、それは完璧に動作

let image = UIImage(contentsOfFile: savePath) 

:D

関連する問題