在后台线程上执行的领域写入仍然阻塞 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 实例。这两种做法都应该避免。