我们知道
在我的项目中,我使用了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函数结合使用还有什么其他好处?
答案 0 :(得分:2)
使用带有perform(_:)
的调度信号量是解决方法:
perform(_:)
方法将您提交的块视为用户事件,这意味着在每个执行块的末尾,它将确保处理所有更改并发送相关通知。通过
perform(_:)
方法提交的每个块都包装在autorelease
池中。
performAndWait(_:)
具有讨厌的副作用,并且没有autoreleasepool,它将完全阻塞调用线程!您必须致电processPendingChanges
或save()
才能使更改生效。