我正在创建一个应用程序,它需要在应用程序退出时将计数器变量(它是一个整数)保存到云中,然后在应用程序激活时加载计数器。我以前从未使用过 CloudKit 有人可以简化我如何使用 swift 来做到这一点吗?我尝试复制的许多示例对于我想要实现的目标来说太复杂了。
注意:在有人提到它之前,我知道还有其他方法可以实现这一点,但我想使用 CloudKit 来实现。
此外,我已经了解 appDelegate 转换的工作原理,因此我不需要帮助:)
最佳答案
CloudKit:好的,让我们做一些计划并得出一致的假设。
- 您需要检查网络是否正常并且可以访问
- 您需要检查用户是否登录到云端
除了编写 noddy 方法之外,您不清楚您真正想在这里做什么的性质;让我们假设您想要更多东西。
- 您使用云工具包保存您的整数,确保处理任何出现的错误。什么样的错误。这里有一份 list 。
枚举 CKErrorCode : Int {
案例内部错误
案例部分失败
案例网络不可用
案例网络故障
案例 BadContainer
案例服务不可用
案例 RequestRateLimited
案例缺失权利
案例未认证
case 权限失败
案件未知项目
case 无效参数
案例结果被截断
案例 ServerRecordChanged
案例 ServerRejectedRequest
案例 AssetFileNotFound
案例 AssetFileModified
案例不兼容版本
案例约束违反
案例操作取消
案例 ChangeTokenExpired
案例 BatchRequestFailed
案例 ZoneBusy
案例 BadDatabase
案例超出配额
案例 ZoneNotFound
超出案例限制
案例 UserDeletedZone
}
- 即使您没有收到任何错误,您也可能想要回读它来检查它,它是一个非常重要的整数。如果您也这样做,则需要处理这些错误。
好的,你保存了它;下次呢。好的,它是相同的 palaver、网络、云工具包、读取、处理错误等。
如果你还在这里,那就太好了。这里的代码只是为了保存一条记录。
func save2Cloud(yourInt:Int) {
let container = CKContainer(identifier: "iCloud.blah")
let publicDB = container.publicCloudDatabase
let newRecord = CKRecord(recordType: "BlahBlah")
newRecord.setObject(yourInt, forKey: "theInt")
var localChanges:[CKRecord] = []
var recordIDsToDelete:[CKRecord] = []
localChanges.append(newRecord)
let saveRecordsOperation = CKModifyRecordsOperation(recordsToSave: localChanges, recordIDsToDelete: nil)
saveRecordsOperation.perRecordCompletionBlock = { record, error in
if error != nil {
self.showAlert(message: error!.localizedDescription)
print(error!.localizedDescription)
}
dispatch_async(dispatch_get_main_queue()) {
// give the UI a all good sign for that record
}
}
saveRecordsOperation.modifyRecordsCompletionBlock = { savedRecords, deletedRecordIDs, error in
if error != nil {
self.showAlert(message: error!.localizedDescription)
print(error!.localizedDescription)
} else {
dispatch_async(dispatch_get_main_queue()) {
// give the UI a all good sign for all records
}
}
}
saveRecordsOperation.qualityOfService = .Background
publicDB.addOperation(saveRecordsOperation)
}
这里是读回它的代码。
var readerOperation: CKQueryOperation!
func read4Cloud(theLink: String, theCount: Int) {
var starCount:Int = 0
let container = CKContainer(identifier: "iCloud.blah")
let publicDB = container.publicCloudDatabase
let predicate = NSPredicate(value: true)
let query = CKQuery(recordType: "BlahBlah", predicate: predicate)
readerOperation = CKQueryOperation(query: query)
readerOperation.recordFetchedBlock = { (record) in
let YourInt = record["theInt"] as! Int
}
readerOperation.queryCompletionBlock = {(cursor, error) in
if error != nil {
// oh dingbats, you need to check for one of those errors
} else {
// got it
}
}
readerOperation.qualityOfService = .Background
publicDB.addOperation(readerOperation)
}
但等等 Matt,这将每次保存一条新记录,并在您重新打开时读回多个 Int。不,这个解决方案需要更多的工作;而且我还没有进行网络或云检查或任何错误...:\
免责声明;我在 SO 中编辑了这段代码,它可能编译不干净:)
关于swift - 如何使用 CloudKit (swift) 保存和加载数字(整数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35931802/