1

xcodeで客観的なcをいじっているだけです。これはばかげた質問のように思えるかもしれませんが、これが私のコードブロックです。動作しますが、希望どおりに動作しません。

        int i = 10;
    int x = 0;
    do {

        printf("Count is: %i\n", x);
        NSString *Result = [[NSString alloc] initWithFormat: @"%i", x];
        counting.text = Result;
        x++;
        usleep(1000000);
    } while (x < i);

ループの最後でラベルを 9 に変更するだけで、コンソールに正常に出力されますが、0 から 9 までカウントしてアプリに表示することになっています。マルチスレッドを行う必要があると思いますが、例はJavaであるため、この言語には適用できません

4

4 に答える 4

2

usleepすべての描画 (およびタッチ、その他の UI インタラクション) を行うメイン スレッドを (で) ブロックしているため、更新されていません。テキストを設定してから、メインスレッドを返す必要があります。このスレッドで遅延呼び出しを設定する必要があります。

int i = 10;
int x = 0;
do {
    printf("Count is: %i\n", x);
    NSString *Result = [[NSString alloc] initWithFormat: @"%i", x];
    [counting performSelector:@selector(setText:) withObject:Result afterDelay:x];
    x++;
} while (x < i);
于 2013-08-23T15:06:01.233 に答える
0

メインスレッドやその他のスレッドでスリープするよりも、タイマーを使用することを好みます。その質問をチェックしてください

NSTimer の使用方法

于 2013-08-23T15:44:04.040 に答える
0

コメントで既に述べたように、問題は、usleep(1000000)更新を含む UI との対話を担当するメイン スレッドがフリーズしているためです。

この行のスリープを変更する[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1]];と、別のスレッドを使用しなくても、このコードは期待どおりに動作するはずです。

int i = 10;
int x = 0;
do {

    printf("Count is: %i\n", x);
    NSString *Result = [[NSString alloc] initWithFormat: @"%i", x];
    counting.text = Result;
    x++;
    [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1]];
} while (x < i);
于 2013-08-23T15:05:47.063 に答える