2016-04-25 2 views
0

Большую часть времени я получаю все результаты, но иногда я этого не делаю, и это, очевидно, проблема. У меня есть функция, как:Царство иногда не возвращает последние результаты

func addProduct(thisProduct:Product) { 
    let realm = try! Realm() 
    try! realm.write { 
     realm.add(thisProduct) 
    } 
    countProductsAddedToday() 
    // sometimes doesn't include the just added product to the count 
} 

Проблема моя функция countProductsAddedtoday() не всегда возвращает правильное количество продуктов при вызове сразу же после операции записи, как в данном случае. Если он будет вызван позже (нажав кнопку в моем приложении), он вернет правильный счет. Я надеюсь, что это распространенная проблема, и что я делаю то, что я не должен делать.

countProductsAddedToday() Функция выглядит так:

func countProductsAddedToday() -> Int { 
    let predicate = NSPredicate(format: "timeAdded >= %d", unixTimestampForToday) 
    let realm = try! Realm() 
    let results = realm.objects(Product).filter(predicate) 
    return results.count 
} 

Дополнительная информация: Я не могу быть уверен, но я думаю, что проблема чаще всего бывает при добавлении продуктов быстро, но затем останавливается происходит. Есть ли отложенная запись или кэширование результатов или что-то в этом роде?

Ошибка я получаю при добавлении продуктов на физическом устройстве:

0 Realm        0x000000010042d7e0 _ZN5realm4util18terminate_internalERNSt3__118basic_stringstreamIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE + 44 
1 Realm        0x000000010042da0c _ZN5realm4util9terminateEPKcS2_l + 340 
2 Realm        0x00000001002a70ac _ZN5realm5_impl16RealmCoordinator19run_async_notifiersEv + 2124 
3 Realm        0x00000001002a6668 _ZN5realm5_impl16RealmCoordinator9on_changeEv + 40 
4 Realm        0x000000010026adf4 _ZN5realm5_impl20ExternalCommitHelper6listenEv + 672 
5 Realm        0x000000010026b89c _ZZN5realm5_impl20ExternalCommitHelperC1ERNS0_16RealmCoordinatorEENK3$_0clEv + 24 
6 Realm        0x000000010026b878 _ZNSt3__112__async_funcIZN5realm5_impl20ExternalCommitHelperC1ERNS2_16RealmCoordinatorEE3$_0JEE9__executeIJEEEvNS_15__tuple_indicesIJXspT_EEEE + 64 
7 Realm        0x000000010026b82c _ZNSt3__112__async_funcIZN5realm5_impl20ExternalCommitHelperC1ERNS2_16RealmCoordinatorEE3$_0JEEclEv + 24 
8 Realm        0x000000010026b73c _ZNSt3__119__async_assoc_stateIvNS_12__async_funcIZN5realm5_impl20ExternalCommitHelperC1ERNS3_16RealmCoordinatorEE3$_0JEEEE9__executeEv + 32 
9 Realm        0x000000010026bfc0 _ZNSt3__114__thread_proxyINS_5tupleIJMNS_19__async_assoc_stateIvNS_12__async_funcIZN5realm5_impl20ExternalCommitHelperC1ERNS5_16RealmCoordinatorEE3$_0JEEEEEFvvEPSB_EEEEEPvSG_ + 388 
10 libsystem_pthread.dylib    0x0000000180cebb28 <redacted> + 156 
11 libsystem_pthread.dylib    0x0000000180ceba8c <redacted> + 0 
12 libsystem_pthread.dylib    0x0000000180ce9028 thread_start + 4 
+0

Является 'countProductsAddedToday()' вызывается в том же потоке, как ваш пример кода указывает или отправляется в другую очередь или поток? – bdash

+0

Я пробовал оба, такая же проблема существует и в обоих случаях. – TimSim

+0

Я тестировал это на симуляторе. Теперь я попробовал его на физическом устройстве (добавив 1 продукт каждую секунду), и, похоже, он работал нормально, но потом я получил сбой 'realm_coordinator.cpp: 435: [realm-core-0.97.4] Утверждение не выполнено: m_advancer_sg- > get_version_of_current_transaction() == new_notifiers.front() -> version() ', повторил все это, и это произошло снова. Очевидно, что пользователи не будут добавлять продукт каждую секунду, но мне нравится, что все происходит последовательно, и я не понимаю, что происходит здесь. – TimSim

ответ

2

Изменить вашу функцию:

func countProductsAddedToday() -> Int { 
    let predicate = NSPredicate(format: "timeAdded >= %d", unixTimestampForToday) 
    let realm = try! Realm() 
    realm.refresh() 
    let results = realm.objects(Product).filter(predicate) 
    return results.count 
} 
+0

Этот ответ - это то, что вы ищете в многопоточных сценариях. Вам нужно будет обновить Realm в любом фоновом потоке, прежде чем вы увидите последние результаты. То же самое относится к основному потоку, если вы написали из фонового потока и отправили его в основной поток непосредственно после записи. – marius

+0

Проблема была из-за моей глупости - 'unixTimestampForToday' был иногда второй секундой вместо полуночи, поэтому, когда операция вставки началась в течение одной секунды, а счет произошел в другой, я бы не получил последний продукт, поэтому он казалось непоследовательным. – TimSim

Смежные вопросы