2

これはかなり奇妙で、ここで基本的な何かが欠けていると確信しています。

私が持っているのは

  • 2 つの UIButton: button1、button2
  • Touchdown button1 には startAction という IBAction があります
  • Touchdown button2 には cancelAction という IBAction があります
  • ストーリーボードでこれらすべてを作成しました

button1 を押すと、for ループが開始されます。この for ループが終了するまで、画面上のボタンをこれ以上押すことはできません。つまり、button2 を押すことはできません。

ボタン1を押したときに、ボタン2を押してボタン1のforループアクションをキャンセルできるようにするにはどうすればよいですか。これが私のコードです

static bool scanCancelled = NO;

-(IBAction)startAction
{
    for (int i=0; i<5000; i++)
    {  
        NSLog(@"i: %d ...", i);

        if (scanCancelled == YES)
        {
            break;
        }
    }//end for-loop
} 

-(IBAction)cancelAction
{
    scanCancelled = YES;
}

将来に興味がある人のために、これは私がやった方法です

-(IBAction)startAction2
{
    //reset it
    scanCancelled = NO;

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
                                             (unsigned long)NULL), ^(void) {
        [self startAction];

    });

}
4

3 に答える 3

2

他の人が言ったように、別のスレッド/プロセスを使用して長時間の for ループを実行する必要があるため、UI はイベントの処理などを続行できます。

ただし、iOS でスレッド化クラスを使用することはお勧めしません。これは、マルチスレッド化に慣れていない限り、少しわかりにくいと思われるかもしれません*。代わりに、Grand Central Dispatch: https://developer.apple.com/library/iosを使用することをお勧めします。 /documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html

それを使用することは非常に簡単で、非常に強力なブロックを紹介します。開始するためのチュートリアルは次のとおりです

*そうは言っても、典型的なスレッド モデルとその動作方法を調べる必要があります。この概念は、iOS や Objective-C を超えて使用されています。

于 2013-09-13T14:30:06.047 に答える
0

for ループを実行する新しいスレッドを開始できます。

于 2013-09-13T14:19:43.073 に答える