環境
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要求などを実行すると、
print
で
createUnsynchronizedRequest
取り組んでいます。
私はそれが
write threads
の問題だと本当に思うブレークポイントを使用してコードの実行を遅くすると、すべてがうまく機能するためです。
3つのWeb要求の失敗とブレークポイントの使用の例 :
ご覧のとおり、ブレークポイントを使用すると、3つのオブジェクトがレルムに追加されます。
同じ3つの失敗したWeb要求とブレークポイントなしの例 :
しかし、ブレークポイントなしで、最初のオブジェクトのみがRealmに追加されます:
何か案が ?
UnsynchronizedRequest
を作成したときDate()
を持つオブジェクト メソッドでは、作成されたオブジェクトは同じ主キーを持ちました。オブジェクト作成間の時空は、
Date()
を作成するには十分ではありません 以前に作成されたものとは異なるオブジェクト。