0

私は音楽アプリに取り組んでいるので、待ち時間を実際に承認することはできません。

私は自分のタッチを処理するために最愛のtouchsBegan/Moved/Endedを使用しています。すべてが順調に進んでおり、(AudioUnitを使用して)トーンを合成し、(GLKitを使用して)指の下でグローを表示することができました。同時にヒットするノート/タッチが4〜7未満であれば、すべて正常に機能します。 、それからそれはおかしくなり、アプリを動かなくなってしまいます。

私は(GLKitインターフェースとシンセエンジン用に作成したインターフェースを使用して)多くの作業を行っているため、それを修正する方法が必要であることを理解しました。

私のコードは次のように構築されています:



- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    for(UITouch *touch in touches)
    {
        CGPoint lePoint = [touch locationInView:self.view];


        doing some calculataions for synth engine.......
        actually making the sound avilable to play through the interface........

        then I start to create the sprite object for the glow
        attaching it to the nsarray of the shapes
        //rejoycing in the awesomness of the sound


        adding the touch to the active touches array


    }

}

touchesEndedでまったく逆のことをします。

それで、それをより良く機能させるために、GLKitのものにGCDを使用して、非同期で発生するようにしました。それは機能しましたが、アレイにないためにグローが画面に表示されたままになることがありました。 touchesEndedはそれを削除しようとしました。

だからそれはうまくいきませんでした、そして誰かが私を助けることができれば私はちょっと無知です、私は感謝するでしょう。

4

1 に答える 1

0

GCDを使用しますが、すべてのタッチを同時に送信できるように、必ず同時キューを使用してください。それらの完了を待つ必要がある場合は、dispatch_applyを使用します。それ以外の場合は、非同期で開始します。

スケジュールされたブロックはキャンセルできないため、タッチが終了またはキャンセルされたかどうかを確認して、ブロックをすぐに戻すことができます。

たとえば、次のようなものです...

for (UITouch *touch in touches) {
    NSValue *key = [NSValue valueWithPointer:(__bridge void*)touch];
    MyData *data = [dictionary objectForKey:key];
    // set whatever attributes you want in the data for this touch
    // You may want to have a cancel flag in there, so you can set it later...
    CGPoint touchPoint = [touch locationInView:self.view];
    dispatch_async(someConcurrentQueue, ^{
        // If only one thing to do, check the flag at beginning, if it is a long task
        // may want to check it periodically so you cancel as soon as possible.
        if (data.touchHasEnded) return;
    });

別の方法は、タッチごとにキューを作成することです。touchesBeganでディスパッチキューを作成し、それにタスクを投げるだけです。それらをすべて終了させることができます。または、touchesEndでキャンセルする必要がある場合もあります。

たとえば、状態がすでに別の状態に変更されている場合、その間の残りのタッチを処理しても意味がない場合があります。

私はこのようなラインスムージングを行いました。

いずれにせよ、集中的な処理を行っている場合は、システムにそれを管理する方法を理解させる必要があります。必要に応じて、実行していることを終了できることを確認してください。

状態を完了としてマークし、touchesEndの後に他に何も処理しないようにしてください...結局のところ、辞書へのキーとしてポインターを使用しているだけです...

于 2012-05-18T22:51:43.950 に答える