1

つまり、継続的に実行されるプロセスがあるが、ユーザーがプロセス操作の特性に影響を与える GUI のパラメーターを変更できる場合、プロセスを配置するのに適した場所はどこNSThreadですかNSTimer?

4

2 に答える 2

1

NSThreadNSTimerは異なるニーズに対応する 2 つの別個のものですが、2 つの機能を比較してみましょう。

使用NSThread:

-(void) doSomethingEverySecond {
     __block int cumValue = 0; // cumulative value
     __block void(^execBlock)() = ^{        
        while (1)
        {
            @try 
            {
                // some code here that might either A: call continue to continue the loop, 
                // or B: throw an exception.
                cumValue++;
                NSLog(@"Cumulative Value is: %i", cumValue);

                if (cumValue == 5)
                    return;
            }
            @finally 
            {
                [NSThread sleepForTimeInterval:1];
            }
        }
    };

    [NSThread detachNewThreadSelector:@selector(invoke) toTarget:[execBlock copy] withObject:nil];
}

使用NSTimer:

-(void) doSomethingEverySecond {
    __block NSTimer *timer = nil;
    __block int cumValue = 0;
    __block void (^execBlock)() = ^{
        cumValue++;
        NSLog(@"Cumulative Value is: %i", cumValue);

        if (cumValue == 5)
            [timer invalidate];
    };

    timer = [NSTimer scheduledTimerWithTimeInterval:1 target:[execBlock copy] selector:@selector(invoke) userInfo:nil repeats:YES];
}

さて、何かを一度だけしたい場合はNSThread、以下に示すように行く方法です:

-(void) doSomethingOnce {    
    __block void (^execBlock)() = ^{
        NSLog(@"Doing something that could take a LONG time!");
    };

    [NSThread detachNewThreadSelector:@selector(invoke) toTarget:[execBlock copy] withObject:nil];
}

さて、NSTimerバリアントについて:

-(void) doSomethingOnce {    
    __block void (^execBlock)() = ^{
        NSLog(@"Doing something that could take a LONG time!");
    };

    [NSTimer scheduledTimerWithTimeInterval:0 target:[execBlock copy] selector:@selector(invoke) userInfo:nil repeats:NO];
}

この理由は、 を使用している間はスレッドを完全に制御できますNSThreadが、 を使用する場合NSTimerは 内で実行しているため、内部でNSRunLoop重い作業が行われると UI がフリーズする可能性があります。それが よりも の利点NSThreadですNSTimer

NSThreadまた、分離された はすぐに実行されることが保証されていますNSTimer。NSRunLoop に基づく は、すぐに実行できる場合とできない場合があるため、実行できません。

3 番目の選択肢があります (技術的には 4 番目の方法もありますが、pthread今は無視します)GCDが、トピックが広すぎてこの投稿でカバーできないため、RTFM をお勧めします。

于 2012-05-14T15:30:35.040 に答える
1

NSThread と NSTimer は相互に排他的ではなく、相互に置き換えられるものでもありません。NSThread を使用すると、実行のスレッドを制御できます。NSTimer はまさにタイマーです。

メイン スレッドではなく、バックグラウンド スレッドで NSTimer を実行するということですか? これは、メイン スレッドで発生すること (アプリケーションとのユーザー インタラクションなど) によってタイマーが遅延する可能性を少なくするため、一般的には良い考えです。

Apple の Threading Programming Guideを読む必要があります。

于 2012-05-14T15:11:47.353 に答える