質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

1013閲覧

AlamofireImageの画像キャッシュについて

JunZenpou

総合スコア24

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

1クリップ

投稿2018/01/15 01:21

###前提・実現したいこと
twitterの様なアプリを現在作成しています。ユーザーの画像をAlamofireImageで読み込んで、tweet画面のタイムライン表示を行っています。コードは以下の様に作成しました。

// // HomeViewController.swift import UIKit import Alamofire import AlamofireImage import SwiftyJSON class HomeViewController: UIViewController,UITableViewDelegate, UITableViewDataSource { // tableView @IBOutlet weak var tableView: UITableView! // ImageView var imageView = UIImageView() // userDefaultのインスタンス let userDefaults = UserDefaults.standard var json = JSON() // リフレッシュコントロール let refreshControl = UIRefreshControl() // UserinfoModelの構造体 var UserinfoModels = [UserinfoModel]() override func viewDidLoad() { super.viewDidLoad() tableView.delegate = self tableView.dataSource = self } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) // データ通信 let url = "" let parameters = ["user_id": readData(key: "user_id")] self.request(url: url, parameters: parameters) print("リクエストデータ: (self.json)") self.parseData(response: self.json) //refreshController refreshControl.attributedTitle = NSAttributedString(string: "更新中") refreshControl.addTarget(self, action:#selector(refresh), for:UIControlEvents.valueChanged) tableView.addSubview(refreshControl) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } @IBAction func Button(_ sender: Any) { //サイドメニュー画面を開いたり、閉めたりする処理 self.evo_drawerController?.toggleDrawerSide(.left, animated: true, completion: nil) } @IBAction func tweetButton(_ sender: Any) { let storyboard: UIStoryboard = self.storyboard! let TweetViewController = storyboard.instantiateViewController(withIdentifier: "TweetViewController") present(TweetViewController, animated: true, completion: nil) } @objc func refresh(){ // 一旦全部消してから、もう一度サーバーからデータを持って来る。更新された差分を取るため UserinfoModels.removeAll() let url = "" let parameters = ["user_id": readData(key: "user_id")] // データ通信 request(url: url, parameters: parameters) // データパース parseData(response: self.json) // tableの更新 tableView.reloadData() refreshControl.endRefreshing() } // responseデータの解析 func parseData(response: JSON) { // imageを取得するためのbaseURL let baseURL: String = "" var ImageURLstring = String() // userの数 let number: Int = response.count for index in 0..<number { // 自分自身だったら飛ばす if String(describing: response[index]["id"]) == readData(key: "user_id"){ continue } // userinfoModelの構造体のインスタンス let userinfoModel = UserinfoModel() userinfoModel.id = String(describing: response[index]["user"]["id"]) userinfoModel.name = String(describing: response[index]["user"]["name"]) userinfoModel.username = String(describing: response[index]["user"]["username"]) userinfoModel.body = String(describing: response[index]["body"]) userinfoModel.time = String(describing: response[index]["created_at"]) ImageURLstring = baseURL + String(describing: response[index]["user"]["image"]["url"]) userinfoModel.imageURLstring = ImageURLstring self.UserinfoModels.append(userinfoModel) } } func request(url: String, parameters: [String: Any]) { // header let access_token: String = readData(key: "access_token") let headers : HTTPHeaders = [ "Authorization": access_token ] //ロックの取得 var keepAlive = true Alamofire.request(url, method: .post, parameters: parameters,encoding: JSONEncoding.default, headers: headers).responseJSON{ (response) in switch response.result { // 通信成功 case .success(let value): self.json = JSON(value) // 通信失敗 case .failure(let error): print("エラー:(error)") } //ロックの解除 keepAlive = false } //ロックが解除されるまで待つ let runLoop = RunLoop.current while keepAlive && runLoop.run(mode: RunLoopMode.defaultRunLoopMode, before: NSDate(timeIntervalSinceNow: 0.1) as Date) { // 0.1秒毎の処理なので、処理が止まらない } } // userdefaultの読み込み func readData(key: String) -> String { let str: String = userDefaults.object(forKey: key) as! String return str } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return self.UserinfoModels.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! HomeTableViewCell let UserinfoModel = UserinfoModels[indexPath.row] cell.nameLabel.text = UserinfoModel.name cell.usernameLabel.text = UserinfoModel.username cell.tweetLabel.text = UserinfoModel.body cell.time.text = UserinfoModel.time // ImageButton let ImageURL = URL(string: UserinfoModel.imageURLstring!)! self.imageView.af_setImage(withURL: ImageURL, placeholderImage: UIImage(named: "user.png")) cell.userImageButton.setImage(self.imageView.image, for: .normal) return cell } /* // MARK: - Navigation // In a storyboard-based application, you will often want to do a little preparation before navigation override func prepare(for segue: UIStoryboardSegue, sender: Any?) { // Get the new view controller using segue.destinationViewController. // Pass the selected object to the new view controller. } */ }

サーバー側をrailsで作成しています。アプリ側で、ユーザーがユーザー画像を変更した時、rails側で画像が上書き保存されます。なので、1ユーザーに対して、1画像パスがある感じで、サーバー側の処理を作成しました。

アプリ側でユーザーがユーザー画像を変更しても、タイムライン(上記のコード)上の画像が変わりませんでした。どうやら、AlamofireImageのcacheが1回目のhttp通信で設定され、2回目以降はcacheを読み込んでいる?(調べたらその様な感じでした。間違っているかもしれません。)とのことだったのですが、

cacheがあるために、ユーザーが画像を変更しても、タイムライン(上記のコード)上で変更されていませんでした。

ユーザーが画像を変更したら、タイムライン(上記のコード)上に、変更された画像のcacheだけの画像変更を反映させたいのですが、どうすればいいでしょうか。

画像cache処理の具体的なコードがイメージつかなかったので、御教授お願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

出来ました。
https://qiita.com/Masaaki/items/231b1f6226c807a658bf
ここを参考にしました。

投稿2018/01/19 08:34

JunZenpou

総合スコア24

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問