CKModifyRecordsOperation логика повторных попыток

Я новичок в CloudKit и выяснил, CKModifyRecordsOperation с основными случаями добавления / удаления / удаления одного CKRecord вовремя. Я хочу использовать его для передачи в нескольких recordsToSave а также recordIDsToDelete, Я знаю, что мне нужно сделать попытку, когда error.userInfo[CKErrorRetryAfterKey] имеет значение. У меня вопрос, как мне повторить эту операцию? Я застрял, выясняя, как узнать, какие записи нужно повторить. Должен ли я повторить все записи? В каком блоке завершения я могу повторить попытку, или в обоих?

Мой код ниже с комментариями, где я не понимаю, как повторить попытку.

func modifyCkRecs(recsToAddOrMod: [CKRecord]?, recordIDsToDelete:[CKRecordID]?, numTries: Int) {


let ops = CKModifyRecordsOperation(recordsToSave: recsToAddOrMod, recordIDsToDelete: recordIDsToDelete)
ops.savePolicy = CKRecordSavePolicy.AllKeys

ops.perRecordCompletionBlock =  { record, error in

  if let error = error {

    var message = error.localizedDescription
    if error.code == CKErrorCode.NotAuthenticated.rawValue {
      print("Not authenticated")
      message = "If you want your data the same on all your Apple devices, then log into iCloud on your device and make sure the iCloud drive is turned on for this app.\nTo enable iCloud, go to Settings -> iCloud"
    }
    if error.code == CKErrorCode.ServiceUnavailable.rawValue {
      print("Service unavailable")
    }
    if error.code == CKErrorCode.RequestRateLimited.rawValue {
      print("Request Rate Limited")
    }
    if error.code == CKErrorCode.NetworkFailure.rawValue {
      print("Network failure!!")
    }
    if error.code == CKErrorCode.InvalidArguments.rawValue {
      print("Invalid Arguments!!")
    }
    print("Error msg: \(message)")

//        if let delayTime = self.retryTime(error) {
//          if numTries < CloudKitAPI.MAX_RETRY {
//            
//            dispatch_after(delayTime, dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0)) {
//              self.modifyCkRecs(????,????, numTries: numTries+1)
//            }
//          }
//          else {
//            print("WARNING: Reached MAX number of retry, giving up")
//          }
//        }
  }
  else {
    print("Update was a success!")
    if let updatedRec = record {
      if let coreDataObj = self.convertRecToCoreData(updatedRec) {
        // archive the CKRecord system fields into Core Data
        coreDataObj.archiveCkMetadata(updatedRec)

        // remove from queue
        self.addedOrModQueue.removeValueForKey(coreDataObj.uuid)
        self.saveAMQueue()
      }
    }
  }
}

// TODO: Figure out what this block is good for
ops.modifyRecordsCompletionBlock = { savedRecords, deletedRecordIDs, error in
  if let error = error {

    var message = error.localizedDescription
    if error.code == CKErrorCode.NotAuthenticated.rawValue {
      print("Not authenticated")
      message = "If you want your data the same on all your Apple devices, then log into iCloud on your device and make sure the iCloud drive is turned on for this app.\nTo enable iCloud, go to Settings -> iCloud"
    }
    if error.code == CKErrorCode.ServiceUnavailable.rawValue {
      print("Service unavailable")
    }
    if error.code == CKErrorCode.RequestRateLimited.rawValue {
      print("Request Rate Limited")
    }
    if error.code == CKErrorCode.NetworkFailure.rawValue {
      print("Network failure!!")
    }
    if error.code == CKErrorCode.InvalidArguments.rawValue {
      print("Invalid Arguments!!")
    }
    print("Error msg: \(message)")

    // RETRY LOGIC HERE????
    // SOMETHING LIKE THE ABOVE BUT WITH THESE ARGS:
    // self.modifyCkRecs(recsToAddOrMod, recordIDsToDelete, numTries: numTries+1)
  }
  else {

    // clean up the deleted queue
    if let deletedRecs = deletedRecordIDs {
      for deletedRecId in deletedRecs {
        if let uuid = NSUUID(UUIDString: deletedRecId.recordName), let index = self.deletedQueue.indexOf(uuid) {
          self.deletedQueue.removeAtIndex(index)
        }
      }
      self.saveDQueue()
    }
  }
}

ops.qualityOfService = .Background
privateDB.addOperation(ops)
}

0 ответов

Другие вопросы по тегам