我如何从 CloudKit completionHandler 中正确地 return 值

How do I return value correctly from CloudKit completionHandler

我的应用程序。使用 CloudKit 将记录保存到 iCloud。我想检查错误并根据成功或失败设置标志。我通过函数调用 return 标志,但这不起作用。 return 即使保存成功,没有报错,值为false。这是因为在完成处理程序将 savedToCloud 设置为真之前,saveHistoryRecordToCloud 函数 return 为假。我知道这与异步网络调用有关,但我 非常 对此很陌生,显然不明白如何处理它。如何准确设置 saveHistoryRecordToCloud return?谢谢您的帮助!代码如下。

    func saveHistoryRecordToCloud(currentWalk: MyCustomTabBarController.Walk ) -> Bool
{
    var savedToCloud = false
    let history = CKRecord(recordType: "History")
    history.setValue(currentWalk.startTime, forKey: "startTime")
    history.setValue(currentWalk.duration, forKey: "duration")

    activityIndicator.startAnimating()
    publicDatabase.save(history) { (savedRecord, error) in
        if error != nil
        {
            print ("Error saving to iCloud " + error.debugDescription)
        } else
        {
            savedToCloud = true
            DispatchQueue.main.async {
                self.activityIndicator.stopAnimating
            }
            print ("Saving History worked!! recordID,recordName = ",savedRecord?.recordID.recordName ?? "" )
        }
    }
    return (savedToCloud)
}

和通话

        tbc!.currentWalk.savedToCloud = saveHistoryRecordToCloud(currentWalk: tbc!.currentWalk)
    print ("tbc!.currentWalk.savedToCloud ", tbc!.currentWalk.savedToCloud)  // always returns false

你说的调用顺序是正确的。一种方法是实现 "callback"(或 "closure")函数。假设您当前的代码看起来像这样(这是伪代码,我可能无法正确理解 Swift 语法):

function1()
{
     line1
     line2
     tbc!.currentWalk.savedToCloud = saveHistoryRecordToCloud(currentWalk: tbc!.currentWalk)
     print ("tbc!.currentWalk.savedToCloud ", tbc!.currentWalk.savedToCloud)  // always returns false
     line 5
     line 6
}

使用回调函数,您可以将该代码分成两个函数,如下所示:

function1()
{
     line1
     line2
     tbc!.currentWalk.savedToCloud = saveHistoryRecordToCloud(currentWalk: tbc!.currentWalk)
}

function1_callback(savedToCloud)
{
     print ("tbc!.currentWalk.savedToCloud ", savedToCloud)  
     line 5
     line 6
}

从完成处理程序的末尾调用 function1_callback(),如下所示:

publicDatabase.save(history) { (savedRecord, error) in
    if error != nil
    {
        print ("Error saving to iCloud " + error.debugDescription)
    } else
    {
        savedToCloud = true
        DispatchQueue.main.async {
            self.activityIndicator.stopAnimating
        }
        print ("Saving History worked!! recordID,recordName = ",savedRecord?.recordID.recordName ?? "" )

        /* new callback added here */
        function1_callback(savedToCloud)
    }
}

代码流从您的第一个函数开始,它调用保存函数,该函数开始异步保存过程,然后您的代码流结束。当异步保存完成时,它会触发完成处理程序。完成处理程序调用回调函数,传递保存操作的结果,您的代码流恢复。