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

在我的应用程序中,我需要对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() }) } 

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

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