在 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 完成后开始一些事情的主要内容,如果未能解决你的问题,请参考以下文章

性能分析从开始输入 URL 到页面加载完成的过程中都发生了什么事情?

JQuery 在开始幻灯片之前等待页面完成加载?

PFQuery 在 Swift 3 转换后没有运行

在元素消失/加载完成后做一些事情

如何开始学习编程:初学者指南

用户电话后快速开始音乐