2017-08-12 20 views
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

+0

@rmaddyこれは今、あなたに感謝します! –

答えて

1

一つの明確な問題がDispatchQueuesyncのあなたの誤用です。毎回新しいキューを作成して、プロパティへのアクセスを保護しません。単一のキューをインスタンスプロパティとして作成し、そのたびに使用します。これにより、一度に1つのスレッドのみがsyncブロック内のコードにアクセスできるようになります。