2

私は 6 か月以来、iOS アプリケーション (Swift で作成) で Parse.com を使用しており、多くの理由で Parse ローカル データストアを使用したいと考えています。

  • アプリケーションをオフラインで使用可能 (取得可能) にする
  • データ使用量を減らす (「更新されていないデータ」を返す多くのクエリ)
  • 読み込み時間の短縮 (主にアプリケーションの起動時とネットワークからのすべてのデータの読み込み時)

そのために、アプリケーションから実行するすべてのクエリに対してこれらのシナリオを処理するグローバル関数を作成したいと考えています。

私はすでに関数が何をすべきかについて具体的な考えを持っていますが、技術的にこの関数を書く方法がわかりません:)

シナリオ:

  • サインアップ/ログイン (チェーン複数クエリ) :

    1. ネットワークからデータを取得する
    2. NSUserDefaults の « lastUpdateLocalDatastore » 変数内に日付を保存します
    3. ローカル データストアにデータを固定する
    4. ローカル データストアからのデータを表示 —> 戻る & TableView を更新
  • アプリのロード (複数のクエリのチェーン) :

    1. ローカル データストアからのデータを表示 —> 戻る & TableView を更新
    2. ネットワークからデータを取得します (Parse の « lastUpdateDate » は NSUserDefault の « lastUpdateLocalDatastore » よりも新しい)
    3. ローカル データストアにデータを固定する
    4. Local Datastore から更新されたデータを表示 —> RETURN & update TableView
  • トリガー更新 (単純なクエリ) :

    1. ネットワークからデータを取得します (Parse の « lastUpdateDate » は NSUserDefault の « lastUpdateLocalDatastore » よりも新しい)
    2. ローカル データストアにデータを固定する
    3. Local Datastore から更新されたデータを表示 —> RETURN & update TableView
  • ログアウト :

    1. ローカル データストアのすべてのデータの固定を解除
    2. NSUserDefault の « lastUpdate » 値をクリア

機能構造 :

IF ( "First login" -> Local Datastore is empty ) {

    Get data from Network
    Pin data in Local Datastore
    Save « lastUpdateLocalDatastore » in NSUSerDefaults
    —> RETURN data in Cache

} ELSE {

    IF ( "Launching application" -> Cache is empty ) {
        Get data from Local Datastore
        —> RETURN data in Cache
    } ELSE IF ( "trigger update" ) {
       Get data from Network
       Pin new data in Local Datastore
       Save « lastUpdateLocalDatastore » in NSUSerDefaults
       —> RETURN data in Cache
    }
}

問題 :

  1. 複数の (非同期の) 返品を処理する方法
  2. 複数のクエリを連鎖できる関数を作成する方法 (たとえば、アプリをロードするときに 6 つの異なるクエリからデータを取得する必要がある)
4

1 に答える 1

5

最後に、この GitHub トピックに基づいてそれを行う方法を見つけました: https://github.com/ParsePlatform/ParseUI-iOS/issues/53

これが私が使用する機能です:

func findObjectsLocallyThenRemotely(query: PFQuery!, block:[AnyObject]! -> Void) {

    let localQuery = (query.copy() as! PFQuery).fromLocalDatastore()
    localQuery.findObjectsInBackgroundWithBlock({ (locals, error) -> Void in
        if (error == nil) {
            println("Success : Local Query", msg: "\(query.parseClassName)")
            block(locals)
        } else {
            println("Error : Local Query", msg: "\(query.parseClassName)", error: error)
        }
        query.findObjectsInBackgroundWithBlock({ (objects, error) -> Void in
            if(error == nil) {
                println("Success : Network Query", msg: "\(query.parseClassName)")
                PFObject.unpinAllInBackground(locals, block: { (success, error) -> Void in
                    if (error == nil) {
                        println("Success : Unpin Local Query", msg: "\(query.parseClassName)")
                        block(objects)
                        PFObject.pinAllInBackground(objects, block: { (success, error) -> Void in
                            if (error == nil) {
                                println("Success : Pin Query Result", msg: "\(query.parseClassName)")
                            } else {
                                println("Error : Pin Query Result", msg: "\(query.parseClassName)", error: error)
                            }
                        })
                    } else {
                        println("Error : Unpin Local Query", msg: "\(query.parseClassName)", error: error)
                    }
                })
            } else {
                println("Error : Network Query", msg: "\(query.parseClassName)", error: error)
            }
        })
    })
}

TO DO :ネットワークから変更されたデータのみを取得するには、「lastUpdateDate」オプションを追加する必要があります。

于 2015-08-20T09:50:30.230 に答える