gpt4 book ai didi

arrays - 分配的空间不足,无法复制数组内容

转载 作者:行者123 更新时间:2023-11-28 07:20:50 27 4
gpt4 key购买 nike

我正在构建一些代码来从数据库中请求多个信息,以便在我的前端包括一个时间表。多个数据库请求。

问题是对于一个特定的请求 where .我正在使用 swiftKuery 和 DispatchGroups 我偶尔会收到但并不总是在我的 XCode 中收到错误消息。这不能通过不同的请求重建,但有时会发生。

这是我的代码片段。

var profWorkDaysBreak = [time_workbreaks]()
let groupServiceWorkDayBreaks = DispatchGroup()

...

///WorkdaysBreakENTER AsyncCall
//UnreliableCode ?
profWorkDays.forEach {workDay in
groupServiceWorkDayBreaks.enter()
time_workbreaks.getAll(weekDayId: workDay.id) { results, error in
if let error = error {
print(error)
}
if let results = results {
profWorkDaysBreak.append(contentsOf: results) // The error happens here !
}
groupServiceWorkDayBreaks.leave()
}
}

...

groupServiceWorkDayBreaks.wait()

结果和 profWorkDaysBreak 变量是相同的,只是有时我会收到消息:

fatal error :分配的空间不足,无法复制数组内容这导致执行停止。

我假设,也许循环有时可能会在 DispatchGroup 中完成较早的执行???但这是我唯一的想法....

最佳答案

这很可能是由某些竞争条件引起的,因为您从多个线程修改了数组。如果两个线程碰巧同时尝试更改数组,就会出现问题。

确保序列化对数组的访问,这应该可以解决问题。您可以为此使用信号量:

var profWorkDaysBreak = [time_workbreaks]()
let groupServiceWorkDayBreaks = DispatchGroup()
let semaphore = DispatchSemaphore(value: 0)
...


profWorkDays.forEach { workDay in
groupServiceWorkDayBreaks.enter()
time_workbreaks.getAll(weekDayId: workDay.id) { results, error in
if let error = error {
print(error)
}
if let results = results {
// acquire the lock, perform the non-thread safe operation, release the lock
semaphore.wait()
profWorkDaysBreak.append(contentsOf: results) // The error happens here !
semaphore.signal()
}
groupServiceWorkDayBreaks.leave()
}
}

...

groupServiceWorkDayBreaks.wait()

这里的信号量就像一个互斥量,最多允许一个线程对数组进行操作。另外,我想强调的是,锁的持有时间应该尽可能短,这样其他线程就不必等待太多。

关于arrays - 分配的空间不足,无法复制数组内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58143558/

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