我在自己的项目中编写了以下内容,并发布它以防有人正在寻找完整答案。
的参数如下:
query
:本PFQuery
你想执行的查询。
queryBoth
:A Bool
如果存在从本地数据存储返回的数据,是否要查询分析服务器的值。 true
将同时查询,并且false
只会在本地数据存储没有返回任何内容的情况下查询服务器。
toCallUponCompletion
:当从服务器,本地数据存储或两者接收到响应时将调用的闭包(函数)。该函数应该接受PFObjects
的数组,并且不返回任何内容。下面的函数将显示该函数的实现。
功能:
func findObjectsInBackgroundFromLocalDataStoreIfPossible (query: PFQuery, queryBoth: Bool, toCallUponCompletion: ([PFObject]) ->()){
var response = [PFObject]()
let queryCopy = query.copy() as! PFQuery
queryCopy.fromLocalDatastore()
queryCopy.findObjectsInBackgroundWithBlock{
(objects: [AnyObject]?, error: NSError?) -> Void in
if error == nil{
if objects?.count == 0{
query.findObjectsInBackgroundWithBlock{
(objects2: [AnyObject]?, error: NSError?) -> Void in
if error == nil{
response = objects2 as! [PFObject]
toCallUponCompletion(response)
}
}
}
else if queryBoth{
response = objects as! [PFObject]
var responseObjectIds = [String]()
for x in response{
responseObjectIds.append(x.objectId)
}
query.whereKey("objectId", notContainedIn: responseObjectIds)
query.findObjectsInBackgroundWithBlock{
(objects2: [AnyObject]?, error: NSError?) -> Void in
if error == nil{
response += objects2 as! [PFObject]
toCallUponCompletion(response)
}
else{
toCallUponCompletion(response)
}
}
}
else{
response = objects as! [PFObject]
toCallUponCompletion(response)
}
}
else{
println("Error being called in 'findObjectInBackgroundFromLocalDataStoreIfPossible' Error is: \(error)")
}
}
}
闭合实现:
func storeResponse (response: [PFObject]){
println(response)
}
要实现相同的功能上述功能,但有多个PFQueries
使用以下命令:
参数不同r如下:
queries
:这是您希望执行该查询的数组PFQueries
。顺序很重要。
toCallUponCompletion
此封闭代替以Int
键和PFObject
值作为参数的字典,并且不返回任何内容。原因是因为发送查询时,它们可能无法完成并以相同的顺序返回。因此字典中每个键值对的关键是它发送的顺序,因此可以在不知道响应的实际内容的情况下使用响应。同样,请参阅函数后面的函数闭包的实现。
功能:
func findObjectsInBackgroundFromMultipleQueriesFromLocalDataStoreIfPossible (queries: [PFQuery], queryBoth: Bool, toCallUponCompletion: ([Int: [PFObject]]) ->()){
var responses = [Int: [PFObject]]()
for query in queries{
var response = [PFObject]()
let queryCopy = query.copy() as! PFQuery
queryCopy.fromLocalDatastore()
queryCopy.findObjectsInBackgroundWithBlock{
(objects: [AnyObject]?, error: NSError?) -> Void in
if error == nil{
if objects?.count == 0{
query.findObjectsInBackgroundWithBlock{
(objects2: [AnyObject]?, error: NSError?) -> Void in
if error == nil{
response = objects2 as! [PFObject]
responses[find(queries, query)!] = response
if responses.count == queries.count{
toCallUponCompletion(responses)
}
}
}
}
else if queryBoth{
response = objects as! [PFObject]
var ids = [String]()
for x in response{
ids.append(x.objectId)
}
query.whereKey("objectId", notContainedIn: ids)
query.findObjectsInBackgroundWithBlock{
(objects2: [AnyObject]?, error: NSError?) -> Void in
if error == nil{
response += objects2 as! [PFObject]
responses[find(queries, query)!] = response
if responses.count == queries.count{
toCallUponCompletion(responses)
}
}
}
}
else{
response = objects as! [PFObject]
responses[find(queries, query)!] = response
if responses.count == queries.count{
toCallUponCompletion(responses)
}
}
}
}
}
}
封闭的实现:
func storeResponses (responses: [Int: PFObject]){
println("The response to the first query is: \(responses[0])")
println("The response to the second query is: \(responses[1])")
println("The response to the third query is: \(responses[2])")
}
为编辑任何建议都非常赞赏。