parsing本地数据存储+networking同步

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

  • 使我的应用程序可用(可检索)脱机
  • 减less数据使用(许多查询返回“未更新的数据”)
  • 减less加载时间(主要是在启动应用程序并从networking加载所有数据时)

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

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

场景:

  • 注册/login(连锁多个查询):

    1. 从networking获取数据
    2. 将date保存在NSUserDefaults中的“lastUpdateLocalDatastore”variables中
    3. 在本地数据存储中固定数据
    4. 显示来自本地数据存储的数据 – > RETURN&更新TableView
  • 加载应用程序(链式多重查询):

    1. 显示来自本地数据存储的数据 – > RETURN&更新TableView
    2. 从networking获取数据(其中Parse中的“lastUpdateDate”比NSUserDefault中的“lastUpdateLocalDatastore”更新)
    3. 在本地数据存储中固定数据
    4. 从本地数据存储显示更新的数据 – >返回和更新TableView
  • 触发器更新(简单查询):

    1. 从networking获取数据(其中Parse中的“lastUpdateDate”比NSUserDefault中的“lastUpdateLocalDatastore”更新)
    2. 在本地数据存储中固定数据
    3. 从本地数据存储显示更新的数据 – >返回和更新TableView
  • 登出 :

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

问题 :

  1. 如何处理多个(asynchronous)返回
  2. 如何使一个函数能够链接多个查询(例如,当我加载我的应用程序时,我需要从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只提取修改的数据。