2016-10-16 5 views
0

ディスパッチキューまたはタスクハンドラが迅速に機能する方法を理解できませんでした3:私はパフォーマンス上の問題があり、複数のブロックを実行したいすべてのブロックが完了するまで関数を終了するのを待ちます。私は単純にブロックを非同期でバックグラウンドで実行しようとしましたが、非同期キューで管理されている同じ配列またはenumerateChildNodes(...)で列挙されているため、 "xxxが変わる間にxxxを使用しようとします"私はSpriteKitノードの最小化を管理してfpsを改善しようとしています。ここで私は、並列に実行したいコードブロックの一例であり、それらは待つ:スウィフト3で同時にコードブロックを実行する機能が完了するまで待つ

func determinePlatformNodesToUse() { 

    // Code Block 1: 
    for platform in platformArray { 
     addPlatformNode(platform, leftDistance: leftDistance, rightDistance: rightDistance) 
    } 

    // Also part of Code Block 1: 
    // resort the platform nodes to guarantee position sequence 
    currentPlatformNodeArray.sort(by: { $0.position.x < $1.position.x }) 

    // Code Block 2: 
    for character in characterArray { 
     if character.type == CharacterType.Enemy { 
      addCharacterNode(character, leftDistance: leftDistance, rightDistance: rightDistance) 
     } 
    } 

    // Code block 3 
    // put all the enemies into an array for update processing will be added in addCharacterNode 
    currentMotionEnemyNodeArray.removeAll() 

    // Also part of Code block 3 
    foregroundNode.enumerateChildNodes(withName: CharacterType.Enemy.rawValue, using: { 
     (node, stop) in 
     if let enemy = node as? CharacterNode { 
      if enemy.motionType != .Stand { // dont use .Stand as they dont have motion 
       self.currentMotionEnemyNodeArray.append(enemy) 
      } 
     } 
    }) 

    // Code Block 4 
    for actionSceneObject in actionSceneObjectArray { 
     addActionSceneObjectNode(actionSceneObject, leftDistance: leftDistance, rightDistance: rightDistance) 
    } 

    // At this point, wait until all blocks 1-4 above have finished 

    // Run blocks 5 - 8 code in all in parallel 

    // wait until blocks 5 - 8 have finished and then leave the function 
    } 
+0

こんにちは、問題が解決された場合は教えてください – KrishnaCA

答えて

0

あなたはNSOperationを使用してやろうとしているものを達成することができます。

func determinePlatformNodesToUse(completion: (_ success: Bool) -> Void) { 

    let queue:OperationQueue = OperationQueue() 
    queue.name = "com.SOQA.SOQA.name" 
    queue.qualityOfService = QualityOfService.default 
    queue.maxConcurrentOperationCount = 6 

    let operation01:BlockOperation = BlockOperation { 
     // Code Block - 1 
    } 

    let operation02:BlockOperation = BlockOperation { 
     // Code Block - 2 
    } 

    let operation03:BlockOperation = BlockOperation { 
     // Code Block - 3 
    } 

    let operation04:BlockOperation = BlockOperation { 
     // Code Block - 4 
    } 

    let operation05:BlockOperation = BlockOperation { 
     // Code Block - 5 
    } 

    let operation06:BlockOperation = BlockOperation { 
     // Code Block - 6 
    } 

    let operation07:BlockOperation = BlockOperation { 
     // Code Block - 7 
    } 

    let operation08:BlockOperation = BlockOperation { 
     // Code Block - 8 
    } 

    operation05.addDependency(operation01) 
    operation05.addDependency(operation02) 
    operation05.addDependency(operation03) 
    operation05.addDependency(operation04) 

    operation06.addDependency(operation01) 
    operation06.addDependency(operation02) 
    operation06.addDependency(operation03) 
    operation06.addDependency(operation04) 

    operation07.addDependency(operation01) 
    operation07.addDependency(operation02) 
    operation07.addDependency(operation03) 
    operation07.addDependency(operation04) 

    operation08.addDependency(operation01) 
    operation08.addDependency(operation02) 
    operation08.addDependency(operation03) 
    operation08.addDependency(operation04) 

    queue.addOperations([operation01, operation02, operation03, operation04, operation05, operation06, operation07, operation08], waitUntilFinished: true) 
} 

この例の使用に疑問がある場合は、お気軽にコメントしてください。お気軽に編集を提案してください。

+0

このアプローチは初めて初めて有効でしたが、2回目には突然変異の例外が発生します。このキューはメインスレッド上で実行されていますか?それ以外の場合は、キューがまだ実行されている間、更新機能が再度呼び出されていると思います。 ***キャッチされていない例外 'NSGenericException'のためアプリを終了します、理由: '*** Collection <__ NSArrayM:0x17405bcc0>が列挙されている間に突然変異しました。 ***ファーストスローコールスタック: – Jacksonsox

関連する問題