Царство: множественная запись одновременно - PullRequest
0 голосов
/ 25 мая 2018

Контекст

У меня проблемы с использованием метода realm.add(object, update: true) подряд.

Я делаю WEB-запросы к своему API и тестирую случайгде интернет отключен.Когда запрос не удался и я получил ответ, я добавляю объект UnsynchronizedRequest realm к Realm.

Проблема

Я должен проверить случай, когда яЯ должен сделать множественный вызов моего API, поэтому я добавлю несколько UnsynchronizedRequest объектов к Realm.

Следующий веб-запрос я запускаю только тогда, когда получаю предыдущий ответ на запрос, поэтому запросы хорошо сцеплены, нет одновременных запросов.

Когда я делаю только один запрос и он не прошел, объект хорошо добавляется к Realm.

Но когдаЯ делаю более одного запроса , только первый добавляется в Царство, а остальные не добавляются.

Что странно, когда яm используя точки останова , все объекты хорошо добавлены в область .Но когда я отключаю точки останова, только первый UnsynchronizedRequest объект добавляется в Царство, другие игнорируются.

Я думаю, что это проблема с потоком write,Док говорит, что он блокирует другой поток, если несколько записей выполняются одновременно, но я не знаю, как решить эту проблему.

Что я выполняю при сбое веб-запроса:

class func createUnsynchronizedRequest(withParameters parameters : Parameters, andRoute route : String){
    print("Adding unsynchronized request to local...")
    let failedRequest = UnsynchronizedRequest()
    failedRequest.parameters = parameters
    failedRequest.route = route
    failedRequest.date = Date()
    RealmManager.sharedInstance.addOrUpdate(object: failedRequest)
}

RealmManager.swift

func addOrUpdate(object : Object){
    try! realm.write {
        realm.add(object, update: true)
    }
}

UnsynchronizedRequest.swift

@objcMembers class UnsynchronizedRequest : Object {


// MARK: - Realm Properties

override static func primaryKey() -> String? {
    return "id"
}

dynamic var id = ""
dynamic var route = ""
dynamic var date : Date! {
    didSet {
        self.id = "\(self.date)"
    }
}
}

Я уже пытался проверить, была ли область в транзакциив методе addOrUpdate перед запуском realm.write это не решило проблему.

Я также пытался отловить ошибку с помощью realm.write, но ошибка не выдается.

Кроме того,если я выполню, например, 3 раза веб-запрос и т.д., который не будет выполнен, я уверен, что мой код выполняется, потому что print in createUnsynchronizedRequest работает.

Я действительно думаю, что это проблема сwrite threads потому что, когда я использую точку останова для замедления выполнения кода, все работает хорошо.

Пример с 3 неудачными веб-запросами и ИСПОЛЬЗОВАНИЕМ ВЫКЛЮЧЕНИЙ :

enter image description here

Как вы можете видеть, используя точки останова, 3объекты хорошо добавляются в область:

enter image description here

Пример с теми же 3 неудачными веб-запросами и без прерываний :

enter image description here

Но теперь без точек останова в область добавляется только первый объект:

enter image description here

Есть идеи?

1 Ответ

0 голосов
/ 25 мая 2018

Когда я создавал свои UnsynchronizedRequest объекты методом Date(), созданные объекты имели одинаковые первичные ключи.

Пространство-время между созданием объекта недостаточно, чтобы отличить объект Date()чем предыдущий созданный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...