解析本地数据存储 + 网络同步

Posted

技术标签:

【中文标题】解析本地数据存储 + 网络同步【英文标题】:Parse Local Datastore + Network Sync 【发布时间】:2015-10-22 21:50:48 【问题描述】:

自 6 个月以来,我在我的 ios 应用程序(用 Swift 编写)中使用 Parse.com,出于多种原因,我想使用 Parse 本地数据存储:

使我的应用程序可以离线使用(可检索) 减少数据使用(许多查询返回“未更新的数据”) 减少加载时间(主要是在启动应用程序和从网络加载所有数据时)

为了做到这一点,我想编写一个全局函数来处理我从应用程序中执行的所有查询的这些场景。

我已经对函数应该做什么有一个具体的想法,但我不知道如何在技术上编写这个函数:)

场景:

注册/登录(链接多个查询):

    从网络获取数据 在 NSUserDefaults 中的“lastUpdateLocalDatastore”变量中保存日期 在本地数据存储中固定数据 显示本地数据存储中的数据 —> 返回并更新 TableView

加载应用(链式多个查询):

    显示本地数据存储中的数据 —> 返回并更新 TableView 从网络获取数据(其中 Parse 中的 «lastUpdateDate» 比 NSUserDefault 中的 «lastUpdateLocalDatastore» 更新) 在本地数据存储中固定数据 显示本地数据存储中的更新数据 —> 返回并更新 TableView

触发器更新(简单查询):

    从网络获取数据(其中 Parse 中的 «lastUpdateDate» 比 NSUserDefault 中的 «lastUpdateLocalDatastore» 更新) 在本地数据存储中固定数据 显示本地数据存储中的更新数据 —> 返回并更新 TableView

退出:

    取消固定本地数据存储中的所有数据 清除 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
    

问题:

    如何处理多个(异步)返回 如何使函数能够链接多个查询(例如,当我加载我的应用程序时,我需要从 6 个不同的查询中检索数据)

【问题讨论】:

【参考方案1】:

最后我找到了一种基于这个 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”选项以仅从网络中获取修改后的数据。

【讨论】:

一个问题,我们可以使用 parse 像 SQLite & Core-data 一样只在本地存储数据吗?

以上是关于解析本地数据存储 + 网络同步的主要内容,如果未能解决你的问题,请参考以下文章

解析本地数据存储以替代 Core Data (iOS) 和 SQLite (Android)

微信小程序本地存储同步跟异步的区别

iOS-Parse.com 将多个设备与本地数据存储同步

解析本地数据存储不一致

解析本地数据存储不显示固定数据

将本地 HTML5 DB(WebSQL 存储,SQLite)与服务器同步的最佳方法(2 路同步)[关闭]