簡體   English   中英

解析本地數據存儲+網絡同步

[英]Parse Local Datastore + Network Sync

從6個月開始,我就在我的iOS應用程序(使用Swift編寫)中使用Parse.com,出於多種原因,我想使用Parse Local Datastore:

  • 使我的應用程序可以離線使用(可檢索)
  • 減少數據使用(許多查詢返回“未更新的數據”)
  • 減少加載時間(主要是在啟動應用程序並從網絡加載所有數據時)

為了做到這一點,我想編寫一個全局函數,處理從我的應用程序執行的所有查詢的這些方案。

我已經對該函數應該做什么有一個具體的想法,但是我不知道如何從技術上編寫該函數:)

場景:

  • 注冊/登錄(鏈接多個查詢):

    1. 從網絡獲取數據
    2. 將日期保存在NSUserDefaults中的“ lastUpdateLocalDatastore”變量中
    3. 在本地數據存儲區中固定數據
    4. 顯示本地數據存儲中的數據->返回並更新TableView
  • 加載應用程序(鏈式多重查詢):

    1. 顯示本地數據存儲中的數據->返回並更新TableView
    2. 從網絡獲取數據(解析中的“ lastUpdateDate”比NSUserDefault中的“ lastUpdateLocalDatastore”新)
    3. 在本地數據存儲區中固定數據
    4. 顯示本地數據存儲中的更新數據->返回並更新TableView
  • 觸發更新(簡單查詢):

    1. 從網絡獲取數據(解析中的“ lastUpdateDate”比NSUserDefault中的“ lastUpdateLocalDatastore”新)
    2. 在本地數據存儲區中固定數據
    3. 顯示本地數據存儲中的更新數據->返回並更新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個不同的查詢中檢索數據)

最后,我找到了一個基於此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)
            }
        })
    })
}

要做:我需要添加“ lastUpdateDate”選項以僅從網絡獲取修改后的數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM