首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解析本地数据存储+网络同步

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

Stack Overflow用户
提问于 2015-07-31 09:13:20
回答 1查看 1.5K关注 0票数 2

自6个月以来,我正在使用Parse.com与我的iOS应用程序(用Swift编写),我想使用,原因有很多:

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

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

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

设想方案:

  • 注册/登录(连锁多查询):
代码语言:javascript
复制
1. Get data from Network
2. Save date inside « lastUpdateLocalDatastore » variable in NSUserDefaults
3. Pin data in Local Datastore
4. Display data from Local Datastore —> RETURN & update TableView

  • 载入应用程式(链式多重查询):
代码语言:javascript
复制
1. Display data from Local Datastore  —> RETURN & update TableView
2. Get data from Network (where « lastUpdateDate » in Parse is newer than « lastUpdateLocalDatastore » from NSUserDefault)
3. Pin data in Local Datastore
4. Display updated data from Local Datastore  —> RETURN & update TableView

  • 触发器更新(简单查询):
代码语言:javascript
复制
1. Get data from Network (where « lastUpdateDate » in Parse is newer than « lastUpdateLocalDatastore » from NSUserDefault)
2. Pin data in Local Datastore
3. Display updated data from Local Datastore  —> RETURN & update TableView

  • 注销:
代码语言:javascript
复制
1. Unpin all data in Local Datastore
2. Clear « lastUpdate » values in NSUserDefault

功能结构:

代码语言:javascript
复制
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个不同的查询中检索数据)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-20 09:50:30

最后,我找到了一种基于以下GitHub主题的方法:https://github.com/ParsePlatform/ParseUI-iOS/issues/53

这里是我使用的函数:

代码语言:javascript
复制
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“选项,以便只从网络中获取修改过的数据。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31742400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档