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

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

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

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

Swift

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

Q&A

解決済

2回答

7858閲覧

【swift】画像の非同期読み込みとキャッシュについて

nyancoro

総合スコア75

iOS

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

Swift

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

0グッド

5クリップ

投稿2015/09/01 13:34

画像をURLから非同期で読み込んでキャッシュし、
次回からはリクエストせずにそれを使いたいと思っています。

以下のように書いた場合、データはキャッシュされるのでしょうか?
(参考:http://qiita.com/sl2/items/5ec1f8edc0e133b26d59

swift

1let url = NSURL(string:"http://画像のURL") 2let req = NSURLRequest(URL:url!) 3 4NSURLConnection.sendAsynchronousRequest(req, queue:NSOperationQueue.mainQueue()){(res, data, err) in 5 let image = UIImage(data:data) 6 // 画像に対する処理 (UcellのUIImageViewに表示する等) 7}

キャッシュされる場合、どのように記述すれば次回からそのデータを参照するようになるのでしょうか?
キャッシュの保存期間や、どのくらいでクリアしたほうが良い等も合わせて教えて頂けると助かります!

色々サイトを見てもよくわからなかったので、質問させていただきました。
よろしくお願いしますm(__)m

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

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

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

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

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

guest

回答2

0

ベストアンサー

特別なコードを書かなければ、自動的にキャッシュが機能します。
それはデフォルトで、ブラウザでそのURLにアクセスしたときと同じ挙動になります。

つまり、HTTPのレスポンスヘッダーの内容に依存しますので、実際にキャッシュされるのか?その有効期限はどのくらいなのか?はサーバー側の設定になります。

アプリ側でキャッシュを制御したい場合は、NSURLRequestCachePolicyにReloadIgnoringLocalCacheDataを設定して、自前でキャッシュを実装してください。

投稿2015/09/01 16:46

Stripe

総合スコア2183

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

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

nyancoro

2015/09/02 10:44

ありがとうございます!勉強になりますm(__)m 実機ではキャッシュはメモリに保存され、アプリを終了すると消えてしまうのでしょうか?
Stripe

2015/09/02 13:02

キャッシュの保存先は、メモリとディスクの両方です。 メモリのみしたければ、NSURLConnectionDataDelegateのfunc connection(connection: NSURLConnection, willCacheResponse cachedResponse: NSCachedURLResponse) -> NSCachedURLResponse?を実装して、storagePolicyを変更してください。
nyancoro

2015/09/02 17:02

ありがとうございます!スッキリしました!
guest

0

たぶんキャッシュされます。

NSURLRequestにはcachePolicyというプロパティがあってデフォルトだと同じURLにアクセスしたらキャッシュからデータを読み込む設定になっていたと思います。

キャッシュされたデータを参照するのに特別な記述は必要ないです(同じ書き方でOK)。
sendAsynchronousRequest を実行したときにキャッシュがなければリクエストするし、あればキャッシュからデータを読み込みます。

キャッシュの保存期間をどのくらいにした方がいいかですが、データの内容によって変わります。
静的なデータ(ずっと変わらないデータ)だったらできるだけ長くキャッシュした方がいいですし、WebAPIからデータを取得するような動的なデータ(取得できるデータが状況によって変わる)の場合はキャッシュしない方がいいこともあります。

下記にキャッシュ制御について詳しいことが書いてありましたのでご参考まで
iOSのHTTP通信のキャッシュの話

投稿2015/09/01 14:42

jollyjoester

総合スコア1585

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

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

nyancoro

2015/09/01 20:42

ご回答ありがとうございます! いつも的確な返答を頂きとても助かっておりますm(__)m >キャッシュの保存期間をどのくらいにした方がいいかですが、データの内容によって変わります。 とのことでしたが、デフォルトではどのようになっているのでしょうか。 キャッシュはメモリに保存され(実機ではファイルには保存されない)、アプリを終了するとキャッシュは消えてしまうという認識で合っていますか? そのあたりご存知でしたら教えて頂けると有り難いですm(__)m
nyancoro

2015/09/01 20:59

「画像をURLから非同期で読み込んでキャッシュし、 次回からはリクエストせずにそれを使いたい」 このような場合、SDWebImageというライブラリを使うことが多いと複数のサイトには記載がありましたが、それほど優れものなのでしょうか…? sendAsynchronousRequestを使った際に問題なく非同期読込&キャッシュされるのであれば、わざわざ使う必要がないのかなーと思ったりもしますが…(*-*)
jollyjoester

2015/09/02 08:44

画像だけ使うのにsendAsynchronousRequest...なんて面倒くさくてやってられない、とか昔からあってデファクトスタンダードだからって理由でSDWebImageを使ってる方も多いと思います。 他にもSDWebImageを使う理由としては下記とかでしょうか? - disk cacheもしてる->memory warningとかでメモリ消されても大丈夫 - 早い(らしい) 開発者がSDWebImageを作った動機とか http://cocoadocs.org/docsets/SDWebImage/2.7/ 他のライブラリとかと比べてどうか https://github.com/rs/SDWebImage/wiki/How-is-SDWebImage-better-than-X%3F とか読んでみるともっと細かく違いがわかって面白いです:-)
nyancoro

2015/09/02 17:03

ありがとうございます!非常に助かりました!m(__)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問