Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 分配给复制数组内容的空间不足_Arrays_Swift - Fatal编程技术网

Arrays 分配给复制数组内容的空间不足

Arrays 分配给复制数组内容的空间不足,arrays,swift,Arrays,Swift,我正在构建一些代码,从数据库请求多个信息,以便在我的前端有一个时间表,包括多个数据库请求 问题是有一个特定的请求在哪里。我在使用swiftKuery和DispatchGroups时,偶尔会收到XCode中的错误消息,但并不总是这样。这不能通过不同的请求进行重构,但有时会发生 下面是我的代码片段 var profWorkDaysBreak = [time_workbreaks]() let groupServiceWorkDayBreaks = DispatchGroup() ... //

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

问题是有一个特定的请求在哪里。我在使用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变量是相同的,只是有时我会收到这样的消息:

致命错误:分配给复制数组内容的空间不足 这将导致执行的停止


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

这很可能是由于您从多个线程修改数组这一事实导致的某些竞争条件造成的。如果两个线程同时尝试更改数组,则会出现问题

确保序列化对阵列的访问,这应该可以解决问题。您可以使用一个信号灯:

var profWorkDaysBreak=[time\u workbreak]()
让groupServiceWorkDayBreaks=DispatchGroup()
让信号量=分派信号量(值:0)
...
profWorkDays.forEach{workDay in
groupServiceWorkDayBreaks.enter()
time_workbreaks.getAll(weekDayId:workDay.id){results,错误在
如果let error=error{
打印(错误)
}
如果让结果=结果{
//获取锁,执行非线程安全操作,释放锁
信号量。等待()
append(contentsOf:results)//错误发生在这里!
信号量
}
groupServiceWorkDayBreaks.leave()
}
}
...
groupServiceWorkDayBreaks.wait()

这里的信号量的作用类似于互斥,最多允许一个线程对数组进行操作。我还想强调一个事实,即锁应该被保持最少的时间,以便其他线程不必等待太多时间。

这很可能是由于您从多个线程修改数组而导致的某些争用条件造成的。如果两个线程同时尝试更改数组,则会出现问题

确保序列化对阵列的访问,这应该可以解决问题。您可以使用一个信号灯:

var profWorkDaysBreak=[time\u workbreak]()
让groupServiceWorkDayBreaks=DispatchGroup()
让信号量=分派信号量(值:0)
...
profWorkDays.forEach{workDay in
groupServiceWorkDayBreaks.enter()
time_workbreaks.getAll(weekDayId:workDay.id){results,错误在
如果let error=error{
打印(错误)
}
如果让结果=结果{
//获取锁,执行非线程安全操作,释放锁
信号量。等待()
append(contentsOf:results)//错误发生在这里!
信号量
}
groupServiceWorkDayBreaks.leave()
}
}
...
groupServiceWorkDayBreaks.wait()

这里的信号量的作用类似于互斥,最多允许一个线程对数组进行操作。我还想强调一个事实,即锁应该被保持尽可能少的时间,以便其他线程不必等待太多时间。

这是迄今为止我让代码可靠运行的唯一方法。。 我完全跳过了的内容,只是转到了forEach循环

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 {
                    results.forEach {profWorkDayBreak in
                        profWorkDaysBreak.append(profWorkDayBreak)
                    }
                /*
                //Alternative causes error !
                profWorkDaysBreak.append(contentsOf: results)
                */
                }
                groupServiceWorkDayBreaks.leave()
            }
        } 

...

groupServiceWorkDayBreaks.wait() 


到目前为止,这是我让代码运行可靠的唯一方法。。 我完全跳过了的内容,只是转到了forEach循环

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 {
                    results.forEach {profWorkDayBreak in
                        profWorkDaysBreak.append(profWorkDayBreak)
                    }
                /*
                //Alternative causes error !
                profWorkDaysBreak.append(contentsOf: results)
                */
                }
                groupServiceWorkDayBreaks.leave()
            }
        } 

...

groupServiceWorkDayBreaks.wait() 


您好,感谢您的反馈,但是您的代码在不等待getAll(对db的异步调用)完成的情况下是否会继续执行?好的,我更新了答案以保持原始组行为,仅使用信号量锁定内容@Bliv_DevI现在找到时间尝试信号量解决方案。。。但由于某些原因,我在设置信号量let时出现以下错误…'init()在Swift中不可用:在Swift中不可用我找不到根本原因here@Bliv_Dev我更新了答案,之前没有将
参数添加到
DispatchSemaphore
初始值设定项调用中。我确实无法运行semaphore方法。。。如果你按你的建议去做,电话似乎永远不会回了。。现在,我转向了基于循环的方法,这似乎是最可靠和安全的方法。您好,感谢您的反馈,但是您的代码在不等待getAll(对db的异步调用)完成的情况下不会导致继续执行吗?好的,我更新了答案,以保持原始的组行为,仅使用信号量进行锁定@Bliv_DevI现在找到时间尝试信号量解决方案。。。但由于某些原因,我在设置信号量let时出现以下错误…'init()在Swift中不可用:在Swift中不可用我找不到根本原因here@Bliv_Dev我更新了答案,之前没有将
参数添加到
DispatchSemaphore
初始值设定项调用中。我确实无法运行semaphore方法。。。如果你按你的建议去做,电话似乎永远不会回了。。我现在转向了基于循环的方法,这似乎是最可靠和安全的方法。