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

how to save and load a number (integer) using CloudKit (swift)

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

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

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

Matt,您应该以另一种方式执行此操作的原因是它更简单,而且几乎肯定比云工具包更可靠。

let defaults = NSUserDefaults.standardUserDefaults()
defaults.setInteger(yourInt, forKey: "blah")

您在 swift 中获得了这些选项 ...

func setBool(value: Bool, forKey defaultName: String)
func setInteger(value: Int, forKey defaultName: String)
func setFloat(value: Float, forKey defaultName: String)
func setDouble(value: Double, forKey defaultName: String)
func setObject(value: AnyObject?, forKey defaultName: String)
func setURL(url: NSURL, forKey defaultName: String)

下次取值

let defaults = NSUserDefaults.standardUserDefaults()
if let yourInt = defaults.integerForKey("blah")
{
    print(yourInt)
}

你还有几个方法可以找回它们

func boolForKey(defaultName: String) -> Bool
func integerForKey(defaultName: String) -> Int
func floatForKey(defaultName: String) -> Float
func doubleForKey(defaultName: String) -> Double
func objectForKey(defaultName: String) -> AnyObject?
func URLForKey(defaultName: String) -> NSURL?
func dataForKey(defaultName: String) -> NSData?
func stringForKey(defaultName: String) -> String?
func stringArrayForKey(defaultName: String) -> [AnyObject]?
func arrayForKey(defaultName: String) -> [AnyObject]?
func dictionaryForKey(defaultName: String) -> [NSObject : AnyObject]?

就是这样;但是等等,你想使用云工具包...让我在 post 之后给你第二个答案。

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

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

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

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

enum CKErrorCode : Int { case InternalError case PartialFailure case NetworkUnavailable case NetworkFailure case BadContainer case ServiceUnavailable case RequestRateLimited case MissingEntitlement case NotAuthenticated case PermissionFailure case UnknownItem case InvalidArguments case ResultsTruncated case ServerRecordChanged case ServerRejectedRequest case AssetFileNotFound case AssetFileModified case IncompatibleVersion case ConstraintViolation case OperationCancelled case ChangeTokenExpired case BatchRequestFailed case ZoneBusy case BadDatabase case QuotaExceeded case ZoneNotFound case LimitExceeded case 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 中编辑了这段代码,它可能编译不干净:)