2016-04-25 8 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() '、すべてを繰り返し、それが再び発生しました。明らかに、ユーザーは1秒ごとに製品を追加することはありませんが、一貫性のあることが起こっているのが好きです。ここではわからないことがあります。 – 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

この回答は、マルチスレッドシナリオでお探しのものです。最新の結果を表示するには、バックグラウンドスレッドでレルムをリフレッシュする必要があります。あなたがバックグラウンドスレッドから書いて、書いた直後にメインスレッドにディスパッチするのであれば、メインスレッドにも同じことが当てはまります。 – marius

+0

問題は私の愚かさに起因していました - 'unixTimestampForToday'は真夜中ではなく現在の秒であることがあったので、挿入操作が1秒間に開始され、カウントが別のもので起きたとき、最新の製品を入手できませんでした。矛盾しているように見えました。 – TimSim

関連する問題