parsing本地数据存储+networking同步
我使用我的iOS应用程序(用Swift编写)Parse.com自6个月以来,我想使用parsing本地数据存储有很多原因:
- 使我的应用程序可用(可检索)脱机
- 减less数据使用(许多查询返回“未更新的数据”)
- 减less加载时间(主要是在启动应用程序并从networking加载所有数据时)
为了做到这一点,我想编写一个全局函数来处理这些场景中的所有查询,我从我的应用程序做的。
我已经有了一个什么function应该做的具体想法,但我不知道如何从技术上写这个function:)
场景:
-
注册/login(连锁多个查询):
- 从networking获取数据
- 将date保存在NSUserDefaults中的“lastUpdateLocalDatastore”variables中
- 在本地数据存储中固定数据
- 显示来自本地数据存储的数据 – > RETURN&更新TableView
-
加载应用程序(链式多重查询):
- 显示来自本地数据存储的数据 – > RETURN&更新TableView
- 从networking获取数据(其中Parse中的“lastUpdateDate”比NSUserDefault中的“lastUpdateLocalDatastore”更新)
- 在本地数据存储中固定数据
- 从本地数据存储显示更新的数据 – >返回和更新TableView
-
触发器更新(简单查询):
- 从networking获取数据(其中Parse中的“lastUpdateDate”比NSUserDefault中的“lastUpdateLocalDatastore”更新)
- 在本地数据存储中固定数据
- 从本地数据存储显示更新的数据 – >返回和更新TableView
-
登出 :
- 取消固定本地数据存储中的所有数据
- 清除NSUserDefault中的“lastUpdate”值
function结构:
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 } }
问题 :
- 如何处理多个(asynchronous)返回
- 如何使一个函数能够链接多个查询(例如,当我加载我的应用程序时,我需要从6个不同的查询中检索数据)
最后我find了一个基于这个GitHub主题的方法: https : //github.com/ParsePlatform/ParseUI-iOS/issues/53
这是我使用的function:
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”选项来从networking只提取修改的数据。