如何从CloudKit completionHandler

时间:2018-04-17 09:52:52

标签: ios multithreading asynchronous cloudkit

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

    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

1 个答案:

答案 0 :(得分:0)

您正确地了解了呼叫顺序。一种方法是实现"回调" (或"关闭")功能。假设您当前的代码看起来像这样(这是伪代码,我可能无法正确获得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)
    }
}

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