【问题标题】:how to save and load a number (integer) using CloudKit (swift)如何使用 CloudKit (swift) 保存和加载数字(整数)
【发布时间】:2016-03-11 03:44:47
【问题描述】:

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

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

另外,我已经了解 appDelegate 转换是如何工作的,所以我不需要帮助 :)

【问题讨论】:

    标签: swift integer int cloudkit


    【解决方案1】:

    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 中编辑了这段代码,它可能编译不干净:)

    【讨论】:

      【解决方案2】:

      Matt,您应该以另一种方式执行此操作的原因是因为它更简单,并且几乎肯定会比云套件更可靠。

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

      你很快就得到了这些选项......

      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]?
      

      就是这样;但是等一下,你想使用云套件...让我在发布此消息后给你第二个答案。

      【讨论】:

      • 这并没有回答有关如何在 Cloud Kit 中执行此操作的问题。随意发表评论建议NSUserDefaults 可能是一个更好的主意。
      猜你喜欢
      • 1970-01-01
      • 2014-10-24
      • 1970-01-01
      • 2019-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多