gpt4 book ai didi

ios - 同步线程中的同步问题

转载 作者:行者123 更新时间:2023-11-28 12:18:27 26 4
gpt4 key购买 nike

很抱歉提前发布了这么多代码。我似乎有同步问题导致我的应用程序崩溃。我将所有代码放在 sync 线程中,所以我不确定这是怎么可能的。根据调用函数的频率,它会在两个不同的地方崩溃,但我怀疑问题的根源是相同的。如果您有任何建议,请告诉我。

代码

var curCollisionChecks = 0

func okToCheckForCollision() -> Bool {

print(curCollisionChecks)

if (curCollisionChecks < 4) {
let collisionQueue = DispatchQueue(label: "collisionQueue")
collisionQueue.sync {
curCollisionChecks += 1
}
return true
}

logText(text: "WARNING: Checking too many collisions")
logText(text: "WARNING: Some may be ignored")

return false
}


func checkColision(object: UIView) {

if (!viewThatRequireChecking.contains((objectToFO[object]?.name)!)){
return
}

let collisionQueue = DispatchQueue(label: "collisionQueue")
collisionQueue.sync {

if (!okToCheckForCollision()) {
return
}

for view in objectToFO.keys {

if (!viewThatRequireChecking.contains((objectToFO[view]?.name)!)){
continue
}

let s0 = [object,view]
let s1 = [view,object]

if (view.frame.intersects(object.frame)) {

if (view == object) {
continue
}

var shouldContinue = false

for combo in collisionsStatus {
if (combo == s0) {
shouldContinue = true
break
}
if (combo == s1) {
shouldContinue = true
break
}
}

if (shouldContinue) {
continue
}

collisionsStatus.append(s0) // SOMETIMES BREAKS HERE
collisionsStatus.append(s1)

let fo1 = objectToFO[view]
let fo2 = objectToFO[object]

if (viewToCollisionParents.keys.contains(view)) {

let script1 = ScriptObjects[(fo1?.name)!]
for curParent in viewToCollisionParents[view]! {

let deplexed = deplex(snap: curParent, object: view)

if ((deplexed[0] as! String) == "Myself") {
if (fo2?.name == fo1?.name) {
run(sender: view, curScript: script1!, parent: curParent)
}
}
else {
if (fo2?.name == (deplexed[0] as! String)) {
run(sender: view, curScript: script1!, parent: curParent)
}
}

}
}

if (viewToCollisionParents.keys.contains(object)) {
let script2 = ScriptObjects[(fo2?.name)!]
for curParent in viewToCollisionParents[object]! {

let deplexed = deplex(snap: curParent, object: object)

if ((deplexed[0] as! String) == "Myself") {
if (fo2?.name == fo1?.name) {
run(sender: object, curScript: script2!, parent: curParent)
}
}
else {
if (fo1?.name == (deplexed[0] as! String)) {
run(sender: object, curScript: script2!, parent: curParent)
}
}

}
}

}
else {
var newCollisionsStatus = [[UIView]]()
// SOMETIMES BREAKS HERE
for combo in collisionsStatus {
if (combo != s0 && combo != s1) {
newCollisionsStatus.append(combo)
}
}
collisionsStatus = newCollisionsStatus
}
}

if (curCollisionChecks > 0) {
curCollisionChecks -= 1
}
}

}

错误信息的类型

fatal error: Index out of range

fatal error: UnsafeMutablePointer.deinitialize with negative count

最佳答案

一个明显的问题是您滥用了 DispatchQueuesync。您每次都创建一个新队列,因此它不会保护对属性的访问。创建单个队列作为实例属性并每次都使用它。这将确保一次只有一个线程可以访问 sync block 中的代码。

关于ios - 同步线程中的同步问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45646087/

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