在 PFQuery 完成后开始一些事情
Posted
技术标签:
【中文标题】在 PFQuery 完成后开始一些事情【英文标题】:start something after PFQuery is finished 【发布时间】:2016-01-06 02:43:59 【问题描述】:查询完成后是否有可能做某事?我有一个查询对象的 PFQuery,这些对象的 objectIds 将附加到一个数组。 materUserObjects 是一个 PFUser,MatesIdsAndNames 是一个字典,其余的是 String `func queryNow()
if mateUserObject.isEmpty == false
for mateId in mateUserObject
let date = NSDate()
let dateInt = date.timeIntervalSince1970
let query = PFQuery(className: "calendarEvents")
query.whereKey("createdBy", equalTo: mateId)
query.whereKey("StartDate", lessThan: dateInt)
query.whereKey("EndDate", greaterThan: dateInt)
query.cachePolicy = .NetworkOnly
query.findObjectsInBackgroundWithBlock( (objects:[PFObject]?, error:NSError?) -> Void in
if error != nil
print(error)
else
if objects?.isEmpty == true
self.freeMateIds.append(mateId.objectId!)
print(self.freeMateIds)
if self.mateUserObject.last == mateId
if self.freeMateIds.isEmpty == false
for freeMate in self.freeMateIds
let oneFreeMate = self.matesIdsAndNames[freeMate]
self.freeMateNames.append(oneFreeMate!)
print(self.freeMateNames)
self.MatesTableView.reloadData()
)
`
【问题讨论】:
【参考方案1】:你使用 query.findObjectInBackgroundWithBlock 吗?如果是,我建议您使用竞赛处理程序:
typealias CompletionHandler = (success: Bool) -> Void
// Ajoute dans le tableau _applications les applications stockées sur Parse
func fetchData(completionHandler: CompletionHandler)
let query = PFQuery(className: "Test")
var supposeObjectCount: Int = 0
var objectCount: Int = 0
// Ajoute un filtre pour la requete
query.orderByAscending("Id")
// Trouve les objets sur Parse
query.findObjectsInBackgroundWithBlock (objects: [PFObject]?, error: NSError?) -> Void in
// S'il n'y a pas d'erreur
if error == nil
supposeObjectCount = objects!.count
if let objects = objects
for object in objects
// ..
if(supposeObjectCount == ++objectCount)
completionHandler(success: true)
else
print("Error")
// Call the function
func test()
fetchData( (success) -> Void in
if success
// Executed when query is completed
)
希望对您有所帮助!
【讨论】:
我想这有点复杂,问题是我有一个 PFUser 数组(mateUserObject),我通过该数组通过:for mate in mateUserObject ...在这个for循环中我查询由该用户创建的事件..所以也许是 for 循环还没有完成?我尝试尽快上传我的代码,我现在在我的 iPad 上.. 作为一个简短的描述:一个 for 循环遍历一个数组,每次它选择一个对象时,都会有一个基于该对象的查询。我尝试使用以下方法捕获上次执行循环的时间: if mateUserObject.last == mate print(mateUserObject) 否则,如果您在使用 PFQuery 而不是使用 query.findObjectInBackgroundWithBlock() 时不关心延迟,则可以使用 let objects = query.findObjects(),然后执行 for对象中的对象,在此 for 循环中,您执行另一个查询 let objectsV2 = query.findObjects() ,然后执行另一个 for 循环...这不是使用 findObjects() 的最佳方法,因为它冻结了主线程,但它可能是一个解决方案。我希望你明白我的意思:) 你最有可能使用 findObjectInBackground 而不是冻结主线程的 findObjects() 来做到这一点 说实话,我不太明白你的意思 :D 但是非常感谢你帮助我,我真的很感激!!!换个方式试试,有没有可能在for循环之后启动一个函数?例如,数组有 20 个对象,我想在循环遍历所有这 20 个对象后做点什么?因为如果我只是在 for 循环下面键入它,它可能会在循环仍在运行时执行吗? 带有解析的 query.findObject 有两种类型。第一个:query.findObjects() 将冻结主线程,因此当执行查询时,您的所有程序都将冻结。执行查询时,除了设备的主页按钮之外,您将无法执行任何操作。第二种查询是:query.findObjectInBackgroundWithBlock... 这将在您的应用程序后台查询数据,以便您能够在应用程序中导航。那么,您是否关心您的应用程序是否冻结了查询时间,或者您更喜欢在后台执行所有这些操作? 我知道你的意思,但不幸的是我不认为这有帮助..我真的认为这是 for 循环... for 循环是否总是以相同的方向通过一个数组?我的意思是,如果我有一个数组,[1,2,3,4,5,6],将: 对于数组 ... 中的数字总是以 1 开头并以 6 结尾?如果您不知道,那没问题,我真的很感谢您为我所做的一切:)以上是关于在 PFQuery 完成后开始一些事情的主要内容,如果未能解决你的问题,请参考以下文章