在后台线程上执行的领域写入仍然阻塞 Main UI
Realm write performed on background thread still blocks Main UI
在我的应用程序中,我需要周期性地对 Realm 执行大量写入,在 100 到 10,000 个对象之间的任意位置。显然这是一个很大的写入,所以我试图在后台执行此写入,以便用户可以执行其他操作,甚至不会注意到写入。不幸的是,即使我认为我的写入是在后台线程上执行的,但主 UI 仍然被阻塞。这是我调用来执行写入领域的方法的要点。这个方法在我正在循环的数组中的单个对象上重复调用。看起来我做错了什么吗?任何帮助将不胜感激。
func writeCustomerToRealm(inputCustomer:Customer) {
let qualityOfServiceClass = QOS_CLASS_BACKGROUND
let backgroundQueue = dispatch_get_global_queue(qualityOfServiceClass, 0)
dispatch_async(backgroundQueue, {
let realm = try! Realm()
realm.beginWrite()
realm.add(self.swapCustomerForRealmCustomer(inputCustomer))
try! realm.commitWrite()
})
}
您提供的代码是使用 Realm 执行异步后台写入的正确方法。它不应该阻塞主线程,除非主线程本身在后台写入正在进行时尝试执行写入事务。
您共享的仪器跟踪表明,主线程上花费的大部分非空闲时间都花在了处理网络套接字消息上。没有迹象表明在主线程上发生了与 Realm 相关的任何工作。主线程上的 Web 套接字消息处理占跟踪总时间段的 45%,很可能是您遇到的 UI 阻塞的原因。大部分 Web 套接字处理时间都花在执行与 NSDateFormatter
相关的工作上。特别是,NSDateFormatter
似乎经常重新生成其基础 CFDateFormatter
。这表明 NSDateFormatter
的属性经常更新,或者每次调用都使用新的 NSDateFormatter
实例。这两种做法都应该避免。
在我的应用程序中,我需要周期性地对 Realm 执行大量写入,在 100 到 10,000 个对象之间的任意位置。显然这是一个很大的写入,所以我试图在后台执行此写入,以便用户可以执行其他操作,甚至不会注意到写入。不幸的是,即使我认为我的写入是在后台线程上执行的,但主 UI 仍然被阻塞。这是我调用来执行写入领域的方法的要点。这个方法在我正在循环的数组中的单个对象上重复调用。看起来我做错了什么吗?任何帮助将不胜感激。
func writeCustomerToRealm(inputCustomer:Customer) {
let qualityOfServiceClass = QOS_CLASS_BACKGROUND
let backgroundQueue = dispatch_get_global_queue(qualityOfServiceClass, 0)
dispatch_async(backgroundQueue, {
let realm = try! Realm()
realm.beginWrite()
realm.add(self.swapCustomerForRealmCustomer(inputCustomer))
try! realm.commitWrite()
})
}
您提供的代码是使用 Realm 执行异步后台写入的正确方法。它不应该阻塞主线程,除非主线程本身在后台写入正在进行时尝试执行写入事务。
您共享的仪器跟踪表明,主线程上花费的大部分非空闲时间都花在了处理网络套接字消息上。没有迹象表明在主线程上发生了与 Realm 相关的任何工作。主线程上的 Web 套接字消息处理占跟踪总时间段的 45%,很可能是您遇到的 UI 阻塞的原因。大部分 Web 套接字处理时间都花在执行与 NSDateFormatter
相关的工作上。特别是,NSDateFormatter
似乎经常重新生成其基础 CFDateFormatter
。这表明 NSDateFormatter
的属性经常更新,或者每次调用都使用新的 NSDateFormatter
实例。这两种做法都应该避免。