领域:同时多次写入

时间:2018-05-25 10:06:37

标签: swift realm

上下文

我在连续使用realm.add(object, update: true)方法时遇到了问题。

我正在向我的API发出WEB请求,而我正在测试禁用互联网连接的情况。当请求失败并收到回复时,我会向UnsynchronizedRequest添加Realm域对象。

问题

我必须测试必须对我的API进行多次调用的情况,因此我会向UnsynchronizedRequest添加多个Realm个对象。

当我收到上一个请求响应时,我才开始下一个Web请求,因此请求很好,没有并发请求。

当我只有一个请求并且失败时,该对象已添加到Realm

但是,当我正在多个请求时,只会将第一个添加到领域,而不会添加其他请求。

奇怪的是,当我使用断点时,所有对象都很好地添加到Realm 。但是当我禁用断点时,只有第一个UnsynchronizedRequest对象被添加到领域,另一个被忽略。

我认为这是write线程的一个问题,doc说如果多个写操作是并发的,它会阻塞其他线程,但我不知道如何解决它。

网络请求失败时执行的操作:

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个网络请求失败和使用断点的示例

enter image description here

正如您所看到的,使用断点,3个对象很好地添加到领域:

enter image description here

示例包含3个失败的网络请求和没有断点

enter image description here

但现在没有断点,只有第一个对象被添加到Realm:

enter image description here

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

当我使用@Test(invocationCount=10, threadPoolSize=4) public void shouldWork() { // test body } 方法创建UnsynchronizedRequest个对象时,创建的对象具有相同的主键。

对象创建之间的空间时间不足以使Date()对象与先前创建的对象不同。