Как мне реализовать сохранение 1000 записей с помощью CloudKit и Swift, не превышая 30 или 40 запросов в секунду

Позвольте мне описать основной поток, который я пытаюсь реализовать:

  1. Вход пользователя
  2. Система получает список подключений пользователя, используя HTTP-запрос к стороннему API (может быть в тысячах). Я назову этот список userConnections.
  3. Система извлекает сохраненные соединения из базы данных моего приложения (может быть в 100 000). Я назову этот список связи.
  4. Затем система проверяет, существует ли уже каждое userConnection в списке connections, и, если нет, сохраняет его в базе данных:

    for userConnection in userConnections {
        if connections.contains(userConnection) {
        //do nothing
        } else {
         saveRecord(userConnection)
        }
      }
    

Проблема в том, что когда первые пользователи входят в систему, приложение попытается сделать 1000 вызовов saveRecord в секунду, что не позволит сервер CloudKit.

Как я могу реализовать это по-другому, используя CloudKit и Swift, чтобы поддерживать приемлемое количество запросов в секунду, например ~ 30 или 40?


person Jim Moody    schedule 29.12.2015    source источник
comment
Я считаю, что вы можете сохранить свои записи в пакетном режиме. См. это видео WWDC.   -  person tktsubota    schedule 29.12.2015


Ответы (1)


Кому интересно, вот как я это сделал. Комментарий TroyT был правильным, что вы можете сохранять свои записи в пакетном режиме. Этот ответ включает в себя бонус пакетов в очереди:

        let save1 = CKModifyRecordsOperation(recordsToSave: list1, recordIDsToDelete: nil)
        let save2 = CKModifyRecordsOperation(recordsToSave: list2, recordIDsToDelete: nil)

        save1.database = publicDB
        save2.database = publicDB

        save2.addDependency(save1)
        let queue = NSOperationQueue()
        queue.addOperations([save1, save2], waitUntilFinished: false)

        save1.modifyRecordsCompletionBlock = { savedRecords, deletedRecordsIDs, error  in
            if (error != nil){
                //handle error
            }else{
                //data saved
            }

        }
person Jim Moody    schedule 02.01.2016
comment
Нельзя пытаться сохранять 1000 записей за раз, сервер выдаст ошибку лимита. Я считаю, что максимум 400. Затем вы можете создавать операции с зависимостью или большую операцию, дающую пакеты за раз. Я думаю, что каждая партия - это только один запрос. - person Joel; 12.01.2016