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

时间:2015-07-31 09:13:21

标签: ios swift parse-platform local-datastore

我在6个月后使用Parse.com和我的iOS应用程序(用Swift编写),我想使用Parse本地数据存储区有很多原因:

  • 使我的应用程序可以脱机使用(可检索)
  • 减少数据使用(许多查询返回«非更新数据»)
  • 减少加载时间(主要是在启动应用程序并从网络加载所有数据时)

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

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

场景:

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

    1. 从网络
    2. 获取数据
    3. 在NSUserDefaults中的“lastUpdateLocalDatastore”变量中保存日期
    4. 在本地数据存储区中固定数据
    5. 显示本地数据存储区中的数据 - >返回&更新TableView
  • 正在加载应用(链式多重查询):

    1. 显示本地数据存储区中的数据 - >返回&更新TableView
    2. 从网络获取数据(Parse中的“lastUpdateDate”比NSUserDefault的“lastUpdateLocalDatastore”更新)
    3. 在本地数据存储区中固定数据
    4. 显示本地数据存储区的更新数据 - >返回&更新TableView
  • 触发更新(简单查询):

    1. 从网络获取数据(Parse中的“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个不同的查询中检索数据)

1 个答案:

答案 0 :(得分:4)

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