解析本地数据存储 + 网络同步
Parse Local Datastore + Network Sync
我在 iOS 应用程序(用 Swift 编写)中使用 Parse.com 从 6 个月开始,我想使用 Parse 本地数据存储,原因有很多:
- 使我的应用程序可离线使用(可检索)
- 减少数据使用(许多查询返回“非更新数据”)
- 减少加载时间(主要是在启动应用程序和从网络加载所有数据时)
为此,我想编写一个全局函数来为我从我的应用程序中执行的所有查询处理这些场景。
我已经对函数应该做什么有了具体的想法,但我不知道如何从技术上编写这个函数:)
场景:
注册/登录(链式多查询):
- 从网络获取数据
- 将日期保存在 NSUserDefaults 中的 « lastUpdateLocalDatastore » 变量中
- 在本地数据存储中固定数据
- 显示来自本地数据存储的数据 —> RETURN & 更新 TableView
正在加载应用程序(链接多个查询):
- 显示来自本地数据存储的数据 —> RETURN & 更新 TableView
- 从网络获取数据(其中 Parse 中的“lastUpdateDate”比 NSUserDefault 中的“lastUpdateLocalDatastore”更新)
- 在本地数据存储中固定数据
- 显示来自本地数据存储的更新数据 —> RETURN & 更新 TableView
触发更新(简单查询):
- 从网络获取数据(其中 Parse 中的“lastUpdateDate”比 NSUserDefault 中的“lastUpdateLocalDatastore”更新)
- 在本地数据存储中固定数据
- 显示来自本地数据存储的更新数据 —> RETURN & 更新 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
}
}
问题:
- 如何处理多个(异步)returns
- 如何使一个函数能够链接多个查询(例如,当我加载我的应用程序时,我需要从 6 个不同的查询中检索数据)
最后我找到了一种基于这个 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" 选项以仅从网络获取修改后的数据。
我在 iOS 应用程序(用 Swift 编写)中使用 Parse.com 从 6 个月开始,我想使用 Parse 本地数据存储,原因有很多:
- 使我的应用程序可离线使用(可检索)
- 减少数据使用(许多查询返回“非更新数据”)
- 减少加载时间(主要是在启动应用程序和从网络加载所有数据时)
为此,我想编写一个全局函数来为我从我的应用程序中执行的所有查询处理这些场景。
我已经对函数应该做什么有了具体的想法,但我不知道如何从技术上编写这个函数:)
场景:
注册/登录(链式多查询):
- 从网络获取数据
- 将日期保存在 NSUserDefaults 中的 « lastUpdateLocalDatastore » 变量中
- 在本地数据存储中固定数据
- 显示来自本地数据存储的数据 —> RETURN & 更新 TableView
正在加载应用程序(链接多个查询):
- 显示来自本地数据存储的数据 —> RETURN & 更新 TableView
- 从网络获取数据(其中 Parse 中的“lastUpdateDate”比 NSUserDefault 中的“lastUpdateLocalDatastore”更新)
- 在本地数据存储中固定数据
- 显示来自本地数据存储的更新数据 —> RETURN & 更新 TableView
触发更新(简单查询):
- 从网络获取数据(其中 Parse 中的“lastUpdateDate”比 NSUserDefault 中的“lastUpdateLocalDatastore”更新)
- 在本地数据存储中固定数据
- 显示来自本地数据存储的更新数据 —> RETURN & 更新 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
}
}
问题:
- 如何处理多个(异步)returns
- 如何使一个函数能够链接多个查询(例如,当我加载我的应用程序时,我需要从 6 个不同的查询中检索数据)
最后我找到了一种基于这个 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" 选项以仅从网络获取修改后的数据。