0

Je suis nouveau dans Xcode et les langages de programmation et j'ai besoin de votre aide. Je travaille sur une application Message et je suis incapable d'utiliser un bloc de gestionnaire d'achèvement. Voici mon code:Swift 3 Comment écrire correctement Completion Handler Block

 @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 = "" 
} 

J'utilise CATransaaction à performBatchUpdates, mais le bloc achèvement Handler dans la méthode performBatchUpdates ne peut pas être terminée. Comme vous pouvez le voir, ce n'est pas la bonne façon de l'écrire et je le sais, mais j'ai essayé tout ce que je sais pour y arriver, mais ce ne sera pas le cas. L'achèvement:

completion: {(true) -> Void in 

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

      }) 

S'il vous plaît aidez-moi. Je vous remercie !!

+0

Bonjour, pouvez-vous poster votre fonction publicdata.save s'il vous plaît – Makaille

Répondre

1

vous pouvez essayer cette

collectionView?.performBatchUpdates({ 
       print("First part") 
      }, completion: { (result: Bool) in 
       print("Second part") 
      }) 
0
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") 
     } 


    }) 

}