上下文
我在连续使用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个网络请求失败和使用断点的示例:
正如您所看到的,使用断点,3个对象很好地添加到领域:
示例包含3个失败的网络请求和没有断点:
但现在没有断点,只有第一个对象被添加到Realm:
有什么想法吗?
答案 0 :(得分:0)
当我使用@Test(invocationCount=10, threadPoolSize=4)
public void shouldWork() {
// test body
}
方法创建UnsynchronizedRequest
个对象时,创建的对象具有相同的主键。
对象创建之间的空间时间不足以使Date()
对象与先前创建的对象不同。