Swift 3 如何正确编写完成处理程序块

Posted

技术标签:

【中文标题】Swift 3 如何正确编写完成处理程序块【英文标题】:Swift 3 How to correctly write Completion Handler Block 【发布时间】:2016-12-20 19:29:40 【问题描述】:

我是 Xcode 和编程语言的新手,我需要您的帮助。我正在开发消息应用程序,但无法使用完成处理程序块。这是我的代码:

     @IBAction func SendButton(_ sender: AnyObject) 


    if self.textfield.text != "" 


        let mess = CKRecord(recordType: "Message")
        mess["content"] = textfield.text as CKRecordValue?

        let publicdata = CKContainer.default().publicCloudDatabase

        publicdata.save(mess, completionHandler: (record, error) -> Void in
            if error == nil 


                let indexpath = NSIndexPath(item: self.chat.count, section: 0)


                CATransaction.begin()
                CATransaction.setDisableActions(true)


                self.CollView.performBatchUpdates (

                    self.chat.insert(mess, at: self.chat.count)
                    self.CollView.insertItems(at: [indexpath as IndexPath])


                , completion: (true) -> Void in

                print("Animation completed")
                self.CollView.contentOffset = CGPoint(x: 0, y: 40)

                )

                CATransaction.commit()

            print("SAVED")


            else
            print("error")
            )

    

    textfield.text = ""

我使用CATransaaction 来执行BatchUpdates,但是performBatchUpdates 方法中的Completion Handler Block 无法完成。如您所见,这不是正确的编写方式,我知道,但是我已经尝试了我所知道的一切来实现它,但它不会。完成:

 completion: (true) -> Void in

            print("Animation completed")
            self.CollView.contentOffset = CGPoint(x: 0, y: 40)

            )

请帮助我。谢谢!!

【问题讨论】:

你好,你能发布你的publicdata.save函数吗 【参考方案1】:

你可以试试这个

collectionView?.performBatchUpdates(
                print("First part")
            , completion:  (result: Bool) in
                print("Second part")
            )

【讨论】:

【参考方案2】:
 func loadData() 
    chat = [CKRecord]()


let publicData = CKContainer.default().publicCloudDatabase


    let query = CKQuery(recordType: "Message", predicate: NSPredicate(format: "TRUEPREDICATE", argumentArray: nil))
    query.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: true)]

    publicData.perform(query, inZoneWith: nil, completionHandler: (results, error) -> Void in

        if let text = results 
        self.chat = text
            DispatchQueue.global(qos: DispatchQoS.QoSClass.default).async  () -> Void in
                self.CollView.reloadData()
            


        else
        print("error")
        


    )


【讨论】:

以上是关于Swift 3 如何正确编写完成处理程序块的主要内容,如果未能解决你的问题,请参考以下文章

完成处理程序和块之间的区别:[iOS]

块是不是也像完成处理程序那样使用回调功能? (斯威夫特/IOS)

swift 3 和 Xcode 8 中的完成处理程序错误

Swift 异步方法和返回/完成块

如何防止 Swift 3 中的嵌套完成块?

解析查询后 Swift 数组为空 - 完成处理程序?