swift - 如何使用 CloudKit (swift) 保存和加载数字(整数)

标签 swift integer int cloudkit

我正在创建一个应用程序,它需要在应用程序退出时将计数器变量(它是一个整数)保存到云中,然后在应用程序激活时加载计数器。我以前从未使用过 CloudKit 有人可以简化我如何使用 swift 来做到这一点吗?我尝试复制的许多示例对于我想要实现的目标来说太复杂了。

注意:在有人提到它之前,我知道还有其他方法可以实现这一点,但我想使用 CloudKit 来实现。

此外,我已经了解 appDelegate 转换的工作原理,因此我不需要帮助:)

最佳答案

CloudKit:好的,让我们做一些计划并得出一致的假设。

  1. 您需要检查网络是否正常并且可以访问
  2. 您需要检查用户是否登录到云端

除了编写 noddy 方法之外,您不清楚您真正想在这里做什么的性质;让我们假设您想要更多东西。

  1. 您使用云工具包保存您的整数,确保处理任何出现的错误。什么样的错误。这里有一份 list 。

枚举 CKErrorCode : Int { 案例内部错误 案例部分失败 案例网络不可用 案例网络故障 案例 BadContainer 案例服务不可用 案例 RequestRateLimited 案例缺失权利 案例未认证 case 权限失败 案件未知项目 case 无效参数 案例结果被截断 案例 ServerRecordChanged 案例 ServerRejectedRequest 案例 AssetFileNotFound 案例 AssetFileModified 案例不兼容版本 案例约束违反 案例操作取消 案例 ChangeTokenExpired 案例 BatchRequestFailed 案例 ZoneBusy 案例 BadDatabase 案例超出配额 案例 ZoneNotFound 超出案例限制 案例 UserDeletedZone }

  1. 即使您没有收到任何错误,您也可能想要回读它来检查它,它是一个非常重要的整数。如果您也这样做,则需要处理这些错误。

好的,你保存了它;下次呢。好的,它是相同的 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/

相关文章:

xcode - AVAudioPlayer 和 SKAction.playSoundFileNamed(...) 导致内存泄漏

python - 如何检查 python 2.7 中的原始输入是否为整数?

java - 将JavaFX TextField的内容转换为Integer

在 C 中将大串数字(14 位)转换为整数或长整数

swift - 从午睡响应中获取 HTTPURLResponse

swift - 使用 SwiftUI,有没有办法将 View 的大小限制为另一个非兄弟 View ?

php - 将字符串转换为 INT 返回 0

python :整数(3.0)= 2

ios - 如何将 View 高度调整到 iOS 中的导航栏下方?

python - 类型错误 : range() integer end argument expected, 已获取 int