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