我的应用。使用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
答案 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)
}
}
代码流从您的第一个函数开始,它调用保存函数,该函数开始异步保存过程,然后代码流结束。当异步保存完成时,它将触发完成处理程序。完成处理程序调用回调函数,传入保存操作的结果,然后恢复代码流。