bugfix> swift > 投稿

環境

realm.add(object, update: true) メソッドの使用に問題がある続けて。

APIにWEBリクエストを送信しています。インターネット接続が無効になっているケースをテストしています。リクエストが失敗してレスポンスが返ってきたら、 UnsynchronizedRequest を追加します Realm へのレルムオブジェクト 。

問題 

APIを複数回呼び出す必要がある場合はテストする必要があるため、複数の UnsynchronizedRequest を追加します Realm へのオブジェクト 。

前のリクエストレスポンスを受信したときにのみ次のWebリクエストを開始するため、リクエストは適切にチェーンされ、同時リクエストはありません。

私が作っているとき唯一 要求と失敗した場合、オブジェクトは Realm に追加されます 。

しかし、私が作っているとき複数のリクエスト最初のもののみが追加されます レルムに追加され、その他は追加されません。

奇妙なのは、私がブレークポイントを使用するすべてのオブジェクトがレルムに追加されます。しかし、ブレークポイントを無効にすると、最初の UnsynchronizedRequest のみ対象 がレルムに追加され、他は無視されます。

write の問題だと思うスレッド、ドキュメントは、複数の書き込みが同時に発生すると他のスレッドをブロックすると言いますが、それを解決する方法はわかりません。

Webリクエストが失敗したときに実行するもの: 

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回失敗したWeb要求などを実行すると、 printcreateUnsynchronizedRequest 取り組んでいます。

私はそれが write threads の問題だと本当に思うブレークポイントを使用してコードの実行を遅くすると、すべてがうまく機能するためです。

3つのWeb要求の失敗とブレークポイントの使用の例 :

ご覧のとおり、ブレークポイントを使用すると、3つのオブジェクトがレルムに追加されます。

同じ3つの失敗したWeb要求とブレークポイントなしの例 :

しかし、ブレークポイントなしで、最初のオブジェクトのみがRealmに追加されます:

何か案が ?

回答 1 件
  • UnsynchronizedRequest を作成したとき   Date() を持つオブジェクト  メソッドでは、作成されたオブジェクトは同じ主キーを持ちました。

    オブジェクト作成間の時空は、 Date() を作成するには十分ではありません  以前に作成されたものとは異なるオブジェクト。

あなたの答え