为什么我们在核心数据中使用performWait?

时间:2018-12-14 08:57:05

标签: ios swift core-data semaphore

我们知道

  • performWait函数在上下文队列中同步执行给定的块。
  • 执行功能异步执行上下文队列中的给定块。

在我的项目中,我使用了performWait函数来获取数据,因为我希望调用线程等待该块执行完毕后再返回。这是实现它的最简单方法。但是后来我意识到performWait的运行速度非常慢。然后,我尝试使用信号量并使用perform函数来实现自己的同步。结果如下:

PerformWait

    let currentTime1 = getCurrentMillis()
    context?.performAndWait({
        ....
    })
    let currentTime2 = getCurrentMillis()
    let diff = currentTime2 - currentTime1
    print("getActivities diff: " + String(diff))

执行和信号量

    let currentTime1 = getCurrentMillis()
    let semaphore = DispatchSemaphore(value: 0)
    context?.perform({
       ....
       semaphore.signal()
    })
    semaphore.wait()
    let currentTime2 = getCurrentMillis()
    let diff = currentTime2 - currentTime1
    print("getActivities diff: " + String(diff))

getActivities差异:1248毫秒

getActivitiesWithSemaphore差异:90毫秒

好的,我知道这很容易。但是,为什么这么慢?将它与Perform函数结合使用还有什么其他好处?

1 个答案:

答案 0 :(得分:2)

使用带有perform(_:)的调度信号量是解决方法:

  

perform(_:)方法将您提交的块视为用户事件,这意味着在每个执行块的末尾,它将确保处理所有更改并发送相关通知。

     

通过perform(_:)方法提交的每个块都包装在autorelease池中。

performAndWait(_:)具有讨厌的副作用,并且没有autoreleasepool,它将完全阻塞调用线程!您必须致电processPendingChangessave()才能使更改生效。