为什么我们在核心数据中使用performWait?
Why do we use performWait in core data?
我们知道
- performWait 函数同步执行上下文队列上的给定块。
- 执行函数异步执行上下文队列上的给定块。
在我的项目中,我使用 performWait 函数来获取数据,因为我希望调用线程在返回之前等到块执行完毕。这是实现它的最简单方法。但后来我意识到 performWait 的工作速度很慢。然后我尝试用信号量实现自己的同步并使用 perform 函数。以下是结果:
执行等待
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 函数的其他优点是什么?
The perform(_:)
method treats the block you have submitted as a user event, which means that at the end of every perform block it will make sure that all changes are processed and relevant notifications are sent.
every block submitted through the perform(_:)
method gets wrapped in an autorelease
pool.
performAndWait(_:)
有严重的副作用而且没有自动释放池,它会完全阻塞调用线程!您必须调用 processPendingChanges
或 save()
才能使更改生效。
我们知道
- performWait 函数同步执行上下文队列上的给定块。
- 执行函数异步执行上下文队列上的给定块。
在我的项目中,我使用 performWait 函数来获取数据,因为我希望调用线程在返回之前等到块执行完毕。这是实现它的最简单方法。但后来我意识到 performWait 的工作速度很慢。然后我尝试用信号量实现自己的同步并使用 perform 函数。以下是结果:
执行等待
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 函数的其他优点是什么?
The
perform(_:)
method treats the block you have submitted as a user event, which means that at the end of every perform block it will make sure that all changes are processed and relevant notifications are sent.every block submitted through the
perform(_:)
method gets wrapped in anautorelease
pool.
performAndWait(_:)
有严重的副作用而且没有自动释放池,它会完全阻塞调用线程!您必须调用 processPendingChanges
或 save()
才能使更改生效。