gpt4 book ai didi

ios - 从 CloudKit 保存 CompletionHandler 返回 Bool 不正确

转载 作者:行者123 更新时间:2023-11-30 12:15:07 24 4
gpt4 key购买 nike

我正在创建一个应用程序,它将记录保存到 CloudKit 并将数据本地存储在 Core Data 中。我确实可以在两个位置保存记录,但是当 iCloud 连接不可用或存在保存错误时,我需要能够处理错误。我以为我可以在 CKModifyRecordsOperation 完成 block 中填充一个变量来区分,但这不起作用 - CloudKit 保存的返回值始终为 false,即使该过程成功。这个想法是首先保存到 CloudKit,然后检索 recordID 并将其与 Core Data 一起保存。

这是我的代码,我从栏按钮调用doTheComboSave()。控制台输出位于代码下方。任何意见,将不胜感激。 Xcode 8.3.3、Swift 3、iOS 10。

func saveNewCloudKitRecord() -> Bool {

privateDatabase = container().privateCloudDatabase
recordZone = CKRecordZone(zoneName: "myPatientZone")

var blockSavedToCloudKit = false

let myRecord = CKRecord(recordType: "Patient", zoneID: (recordZone?.zoneID)!)
myRecord.setObject(firstNameTextField.text as CKRecordValue?, forKey: "firstname")
myRecord.setObject(lastNameTextField.text as CKRecordValue?, forKey: "lastname")
let parentRefID = CKRecordID(recordName: "047EBE6C-AB1C-0183-8D80-33C0E4AE228B", zoneID: (recordZone?.zoneID)!)
//
//bunch more record fields
//

let modifyRecordsOperation = CKModifyRecordsOperation(recordsToSave: [myRecord], recordIDsToDelete: nil)
modifyRecordsOperation.timeoutIntervalForRequest = 10
modifyRecordsOperation.timeoutIntervalForResource = 10

modifyRecordsOperation.modifyRecordsCompletionBlock = {

records, recordIDs, error in

if let err = error {
blockSavedToCloudKit = false
//create placeholder record name for later updating
} else {
blockSavedToCloudKit = true
self.currentRecord = myRecord
self.passedInCKRecord = myRecord
}//if err

}//modifyRecordsOperation

privateDatabase?.add(modifyRecordsOperation)

print("blockSavedToCloudKit is \(blockSavedToCloudKit)")
return blockSavedToCloudKit

}//saveNewCloudKitRecord


typealias SavedCompletion = (_ success:Bool) -> Void

func saveTwoFiles(completionHandler : SavedCompletion) {

let flag = saveNewCloudKitRecord()
print("flag is \(flag)")

completionHandler(flag)
print("completionHandler(flag) is \(flag)")
}//makeTheComboSave

func doTheComboSave() {

saveTwoFiles() { (success) -> Void in

print("saveTwoFiles is \(success)")

if success {
//will pass the CKRecord so core data can store the recordID and recordName
saveTheNewRecord()//this is the Core Data save

DispatchQueue.main.async {
self.performSegue(withIdentifier: "unwindToMasterViewController", sender: self)
print("Completion block has been run successfully.")
}//Dispatch

} else {
//create placeholder recordName for later updating
saveTheNewRecord()//this is the Core Data save
DispatchQueue.main.async {
self.performSegue(withIdentifier: "unwindToMasterViewController", sender: self)
print("Completion block has been run but the file save to CloudKit failed.")
}//Dispatch


}//if else
}//block

}//doTheComboSave

控制台输出:

blockSavedToCloudKit is false

flag is false

saveTwoFiles is false

completionHandler(flag) is false

Completion block has been run but the file save to CloudKit failed.

success in modifyRecordsOperation

currentRecordName is: B53DCFB8-0EFB-4E79-8762-FECCEFBA9BD8

最佳答案

请参阅上面 Ichydon 的评论。

saveNewCloudKitRecord() 函数在completionHandler 设置我想要使用的 bool 值之前返回。整个想法是首先创建 CloudKit 记录,以便我可以检索要存储在 Core Data 中的 recordName,以便同步本地和云记录。

更好的方法是首先保存到 Core Data,但自己创建 CKRecordID,并在保存到 CloudKit 时将其提供给记录。

在保存Core Data记录的函数中:

let myRecordName = UUID().uuidString

然后返回该字符串以用作 CloudKit 保存的参数。

let myRecordID : CKRecordID = CKRecordID(recordName: myRecordName, zoneID: (recordZone?.zoneID)!)

let myRecord = CKRecord(recordType: "Whatever", recordID : myRecordID)

希望这对其他人有帮助。

关于ios - 从 CloudKit 保存 CompletionHandler 返回 Bool 不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45517180/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com