在后台线程上执行的Realm写仍然阻止主UI

时间:2016-05-09 19:29:35

标签: ios swift multithreading grand-central-dispatch realm

我的应用程序中,我需要定期对Realm执行大量写操作,在100到10,000个对象之间。显然这是一个大写,所以我试图在后台执行这个写操作,以便用户可以执行其他操作,甚至没有注意到写。不幸的是,尽管我认为我的写作是在后台线程上执行的,但主UI仍然被阻止。这是我调用以执行对域的写入的方法的jist。从我循环遍历的数组中的单个对象上重复调用此方法。看起来我做了一些明显的错误吗?任何帮助将不胜感激。

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()
 })
}

1 个答案:

答案 0 :(得分:5)

您提供的代码是使用Realm执行异步后台写入的正确方法。除非主线程本身在后台写入过程中尝试执行写入事务,否则它不应该阻塞主线程。

您共享的仪器跟踪表明在主线程上花费的大部分非空闲时间都用于处理Web套接字消息。在主线程上没有任何与Realm相关的工作的迹象。主线程上的Web套接字消息处理占跟踪总时间的45%,可能是您遇到阻止的UI的原因。大部分Web套接字处理时间用于执行与NSDateFormatter相关的工作。特别是,NSDateFormatter似乎经常重新生成其基础CFDateFormatter。这表明NSDateFormatter的属性经常更新,或者每个调用都使用新的NSDateFormatter实例。应该避免这两种做法。