Ios 函数在下一行代码之前完全执行。

Ios 函数在下一行代码之前完全执行。,ios,swift3,Ios,Swift3,我的viewController中有此代码。问题是当调用两个函数来加载CKRecord对象中的所有数据时。下一行代码执行并打印0作为记录计数。我希望Swift等待这两个函数完成,然后打印它们的计数。解决这个问题需要帮助 override func viewDidLoad() { super.viewDidLoad() view1.layer.borderWidth = 1 view1.layer.cornerRadius = 10 tableView.layer.

我的viewController中有此代码。问题是当调用两个函数来加载CKRecord对象中的所有数据时。下一行代码执行并打印0作为记录计数。我希望Swift等待这两个函数完成,然后打印它们的计数。解决这个问题需要帮助

override func viewDidLoad() {
    super.viewDidLoad()
    view1.layer.borderWidth = 1
    view1.layer.cornerRadius = 10
    tableView.layer.borderWidth = 1
    tableView.layer.cornerRadius = 10

    loadNewData()     // function that loads all partyAccounts
    fetchPartyAccounts() // function to load all transactions

    print(loadTransactionData.count)
    print(partyAccountsData.count)
}

func loadNewData() {
    let qry = CKQuery(recordType: "PartyAccounts", predicate: NSPredicate(format: "TRUEPREDICATE", argumentArray: nil))
    qry.sortDescriptors = [NSSortDescriptor(key: "Party_ID", ascending: true)]
    publicDB.perform(qry, inZoneWith: nil) { (results, error) in
        DispatchQueue.main.async {
            if let rcds = results {
                self.partyAccountsData = rcds
            }
        }
        if error != nil {
            self.showAlert(msg: (error?.localizedDescription)!)
        }
    }
    self.tableView.reloadData()

}

func fetchPartyAccounts() {
    let qry = CKQuery(recordType: "Transactions", predicate: NSPredicate(format: "TRUEPREDICATE", argumentArray: nil))
    qry.sortDescriptors = [NSSortDescriptor(key: "Party", ascending: true)]
    publicDB.perform(qry, inZoneWith: nil) { (results, error) in
        DispatchQueue.main.async {
            if let rcds = results {
                self.loadTransactionData = rcds
            }
            if error != nil {
                self.showAlert(msg: (error?.localizedDescription)!)
            }
        }
    }
    self.tableView.reloadData()
}

做这样的事

variable_A= your_First_Function()     
variable_B=  your_Second_Function() 
print(variable_A)
print(variable_B
希望这能解决你的问题。虽然不确定,但你可以试一试。请务必告诉我它是否有效。

您可以尝试以下方法:

override func viewDidLoad() {
    super.viewDidLoad()
    view1.layer.borderWidth = 1
    view1.layer.cornerRadius = 10
    tableView.layer.borderWidth = 1
    tableView.layer.cornerRadius = 10

    loadNewData(){
         print(partyAccountsData.count)
    }     // function that loads all partyAccounts
    fetchPartyAccounts() {
         print(loadTransactionData.count)
    } // function to load all transactions

   // print(loadTransactionData.count)
   // print(partyAccountsData.count)
}

func loadNewData(callback:@escaping () -> Void) {
    let qry = CKQuery(recordType: "PartyAccounts", predicate: NSPredicate(format: "TRUEPREDICATE", argumentArray: nil))
    qry.sortDescriptors = [NSSortDescriptor(key: "Party_ID", ascending: true)]
    publicDB.perform(qry, inZoneWith: nil) { (results, error) in
        DispatchQueue.main.async {
            if let rcds = results {
                self.partyAccountsData = rcds
                self.tableView.reloadData()
                callback()
            }
        }
        if error != nil {
            self.showAlert(msg: (error?.localizedDescription)!)
        }
    }


}

func fetchPartyAccounts(callback:@escaping () -> Void) {
    let qry = CKQuery(recordType: "Transactions", predicate: NSPredicate(format: "TRUEPREDICATE", argumentArray: nil))
    qry.sortDescriptors = [NSSortDescriptor(key: "Party", ascending: true)]
    publicDB.perform(qry, inZoneWith: nil) { (results, error) in
        DispatchQueue.main.async {
            if let rcds = results {
                self.loadTransactionData = rcds
                callback()
                self.tableView.reloadData()

            }
            if error != nil {
                self.showAlert(msg: (error?.localizedDescription)!)
            }
        }
    }

}

谢谢你的帮助,但它仍然按照你的方法返回0。不要问,告诉我。学习理解异步方法是如何工作的。将打印行分别放在完成块的末尾。并将要重新加载表视图的行也放入完成块(在分派块内部)中。这表明错误表明-parameter callback()隐式不转义。当我单击修复它时,它会将callback:()->Void更改为callback:@escaping()->Void@Aakash你说得对,这能解决你的问题吗?