web-dev-qa-db-ja.com

SWIFTでAPIからJSONをキャッシュする最良の方法?

SwiftのAPIからJSONデータをキャッシュする必要があります。だから私はたくさんを調査してこれに到達します 投稿

アプリにオプション1を実装しようとしました。しかし、カスタムマネージャーは常にnilを返しました。なぜだかわかりませんか?

その後、私は AwesomeCache を取得しました。それはすごいAPIキャッシングだと言っています。しかし、これを実装する方法がわかりませんか?私はこれを参照しました Issue 。それでも私はそれを理解することができません。

これは私の現在の実装がキャッシュなしでどのように見えるかです:

Alamofire.request(.GET, "http://api.androidhive.info/volley/person_array.json")

    .responseJSON { (_, _, data, _) in
        let json = JSON(data!)
        let catCount = json.count
        for index in 0...catCount-1 {
            let name = json[index]["name"].string
            println(name)
         }

APIからJSONをキャッシュする最善の方法を教えてください。

前もって感謝します!

[〜#〜]更新[〜#〜]

これらは私の要件です

  1. APIからJSONをフェッチし、JSONデータを解析します。これらはAlamofire&SwiftyJSONの助けを借りて行うことができます

  2. 解析したデータをテーブルビューに入力します。ユーザーがオンラインのときに機能します。

しかし、ユーザーがオフラインのときにもデータをテーブルに表示したいと思います。

パースされたデータまたはJSONデータをキャッシュに保存する必要があり、1週間または数日以内にキャッシュを更新または期限切れにする必要があります。

JSONは更新されるため、ディスクに保存することは好みません。

これを達成するための最良の方法を教えてください...

14
AruLNadhaN

あなたはすでに自由に使える多くのツールを持っています。

NSURLCache

すべてのリクエストは、Alamofire NSURLCacheNSURLSessionConfiguration内に格納されているNSURLSessionsharedInstance内のManagerにすでに格納されています。これらの格納された要求は、ヒットしているサーバーによって提供されるすべてのキャッシュポリシールールに従っています。独自のカスタム NSURLSessionConfigurationrequestCachePolicyを設定することで、キャッシュ動作を制御できます。 NSURLCache の詳細とその制御方法について説明するこの素晴らしいNSHipsterの記事を読むこともお勧めします。

カスタムManagerオブジェクトの作成は、現在のAlamofire docs でカバーされています。

JSONをディスクにダウンロードする

Alamofire.downloadを使用する代わりに、Alamofire.requestを使用してJSONをディスクに直接ダウンロードすることもできます。これにより、fileURLクロージャーで指定したdestinationにペイロードがダウンロードされます。これにより、その時点以降のファイルのキャッシュを完全に制御できます。サーバーによって提供されるキャッシングヘッダールールに従う場合は、後でこれらのファイルに独自のキャッシングポリシーを作成する必要があります。

テーブルビューの設定

データをディスクにダウンロードしたら、それをNSData blobにロードし、JSONに解析してテーブルビューに入力する必要があります。これは非常に簡単です。ダウンロードを開始するときにAlamofireに指定した宛先NSURLが必要です。次に、ファイルデータをNSData blobにロードします。最後に、NSJSONSerializationを使用してNSDataオブジェクトをJSON AnyObjectに変換し、モデルオブジェクトに解析してテーブルビューに入力します。

明らかに、JSONをモデルオブジェクトに解析する必要はありませんが、これはテーブルビューを不正なJSONデータから保護するのに役立ちます。

オフラインで使用するためのJSONの保存

このアプローチを続ける場合は、CoreDataやSQLiteなどでキャッシュの有効期限を追跡する必要があります。これを行うには、ディスク上のJSONファイルへのパスをキャッシュするか、モデルオブジェクトをCoreDataまたはSQLiteに直接保存します。これはかなり複雑になる可能性があるので、モデルオブジェクトをキャッシュしたくない場合を除いて、この方法はお勧めしません。

オフラインでの使用

一般に、オフラインで使用するためにデータをキャッシュする必要がある場合は、モデルオブジェクトをCoreDataなどに保存します。 AlamofireのrequestメソッドとresponseJSONシリアライザーを組み合わせて使用​​して、データをJSONに解析します。次に、JSONをモデルオブジェクトに変換します。そこから、モデルオブジェクトをCoreDataに保存し、最後にテーブルビューにモデルオブジェクトを入力します。

このアプローチの良い点は、デバイスがオフラインのときにテーブルビューにアクセスする場合に備えて、すべてのモデルオブジェクトがキャッシュされることです。このデザインをNSURLCacheへのクエリと組み合わせて、リクエストがキャッシュされているかどうかを確認すると、すでにモデルオブジェクトが生成されている場合に、不要なサーバー呼び出しや解析ロジックを回避できます。

元の質問に対する更新を考慮して、このアプローチをお勧めします。

30
cnoon

このキャッシュオープンソースを使用できます。ディスクとメモリにデータをキャッシュします。多くのSwiftタイプ、およびNSObjectを継承してNSCodingプロトコルに準拠するカスタムクラスをキャッシュできます。

https://github.com/huynguyencong/DataCache

実装するには:まず、memキャッシュにNSCacheを使用します。 NSCacheは辞書のように使用します。次に、キャッシュをディスクに保存し、NSFileManagerメソッドを使用します。

2
huync