1

私はiOSプログラミングに非常に慣れていませんが、解決できない大きな問題がすでにあります。とても簡単なようです。

ボタンがあります。それをクリックして、というラベルを変更します。message

コードは次のとおりです。

- (IBAction)react:(id)sender {
    int hasard ;
    hasard=3; 
    message.text=[NSString stringWithFormat:@"1 %d",hasard];    
    sleep (1);
    message.text=[NSString stringWithFormat:@"2 %d",hasard]; 
}

それはうまく機能しますが、最初のmessage.text変化は見られません。ボタンをクリックすると、1秒待たなければなりません。2 3

見えると思っ1 3たので、ちょっと待ってから見てください2 3。何が欠けている?それはとても明白なようです。

4

2 に答える 2

6

sleep()メインスレッドである現在のスレッドの実行を中断するため、メソッドが完了するまですべての UI 操作をブロックします。現在の実行ループをブロックせずに、指定された時間の後に実行するように 2 番目の割り当てをスケジュールする必要があります。これは GCD で実現できます。

- (IBAction)react:(id)sender {
    int hasard ;
    hasard=3; 
    message.text=[NSString stringWithFormat:@"1 %d",hasard];

    int64_t delayInSeconds = 1.0;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
        message.text=[NSString stringWithFormat:@"2 %d",hasard];
    });
}
于 2013-01-04T13:47:33.263 に答える
1

メインスレッドをブロックしています(まあ、むしろsleep()ブロックしています)。その場合、コミットされた UI の変更は表示されず、最終結果のみが表示されます。何か他のことをしなければなりません (ちなみに、UI をブロックすることは、ユーザー エクスペリエンスの点で非常に悪い考えです)。たとえば、タイマーを使用してみることができます。

int hasard = 3;

- (void)react:(id)sender
{
     message.text = [NSString stringWithFormat:@"1 %d", hasard];
     [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(timer:) userInfo:nil repeats:NO];
}

- (void)timer:(NSTimer *)tmr
{
     message.text = [NSString stringWithFormat:@"2 %d", hasard];
}
于 2013-01-04T13:48:49.213 に答える