1
あまりにも多くのコードを投稿するのはお早めに申し訳ありません。私は、同期の問題が私のアプリをクラッシュさせる原因と思われる。 sync
スレッドにすべてのコードを入れて、どうすればこのことが可能か分かりません。関数が呼び出される頻度に応じて2つの異なる場所でクラッシュしますが、問題の原因が同じであると思われます。アドバイスがあれば教えてください。エラーメッセージの同期スレッドでの同期の問題
コード
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
@rmaddyこれは今、あなたに感謝します! –