gpt4 book ai didi

swift - 保存多个带有核心数据的异步上下文,数据丢失

转载 作者:行者123 更新时间:2023-11-28 14:55:49 25 4
gpt4 key购买 nike

当应用程序启动时,我想更新我当前的数据库。有时并非所有数据都得到保存,有些数据会丢失。

我正在用这个函数做保存:

func save1() {
let group = DispatchGroup()

for a in save.oldVersion.defaExchangesEinzeln {
if save.checkForVersionExchange(exchange: a.key) {
group.enter()
save.saveVersionExchanges(exchange: a.key)
save.storeContainer.performBackgroundTask{ context in
self.save.saveDefAExchange(managedContext: context, exchange: a.key)
try? context.save()
group.leave()
}
}
}
for b in save.oldVersion.fdefCoinstBtc {
if save.checkForVersionFdefCoinsTBTC(exchange: b.key) {
save.saveVersionFdefCoinsTBTC(exchange: b.key)
}
}

for c in save.oldVersion.fdefCoinstUsd {
if save.checkForVersionFdefCoinsTUSD(exchange: c.key) {
save.saveVersionFdefCoinsTUSD(exchange: c.key)
}
}

if save.checkForCoinNamesExall() || save.checkForVersionIconsExall() || save.checkForVersionFdefCoinsTarrExall() {
save.saveVersionOthers()
}

if save.checkForCoinNamesExall() {
group.enter()
storeContainer?.performBackgroundTask{ context in
self.save.saveCoinNames(managedContext: context)
do {
try context.save()
} catch let error {
print(error.localizedDescription)
}
group.leave()
}
}
if save.checkForVersionIconsExall() {
group.enter()
storeContainer?.performBackgroundTask { context in
self.save.saveIcons(managedContext: context)
do {
try context.save()
} catch let error {
print(error.localizedDescription)
}
group.leave()
}
}

if save.checkForVersionFdefCoinsTarrExall() {
group.enter()
storeContainer?.performBackgroundTask { context in
self.save.saveGroups(context)
do {
try context.save()
} catch let error {
print(error.localizedDescription)
}
group.leave()
}
}
group.notify(queue: .main) {
print("Update complete 1")
self.delegateWebsocket?.startWebsocket()
}
}

我可以想象,由于异步调用,上下文会以某种方式相互冲突。为什么会这样?我可以做些什么来改进代码?谢谢!

最佳答案

使用 performBackgroundTask 非常方便,但它有一个尖锐的边缘,一开始并不总是很明显。每次您调用 performBackgroundTask 时,都会创建一个新的上下文,并且您传入的 block 会在该上下文的专用队列上执行。该 block 异步执行。

结果是,如果您像现在一样在循环中重复调用 performBackgroundTask,则无法保证 block 将彼此同步。这可能是个问题。

您可以采用多种方法来处理此问题。我不确定我是否遵循了您的所有代码,所以我不确定哪个可能是最好的。备选方案包括:

  • 将所有代码包装在一个 performBackgroundTask 中,而不是创建一堆后台任务。或者可能只是通过将 performBackgroundTask 放在您的初始循环而不是内部来 reduce task 的数量。
  • 放下performBackgroundTask。相反,创建一个单一的背景上下文并使用它。使用 newBackgroundContext() 获取新上下文并保留它。然后用 performperformAndWait 调用该上下文替换上面的后台任务。

关于swift - 保存多个带有核心数据的异步上下文,数据丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49390335/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com