1

NSTimer を使用するか、定期的にスレッドを起動させることで、定期的に関数を呼び出すことができます。2 つのアプローチは基本的に同じように動作します。

        timer = [ NSTimer
                 scheduledTimerWithTimeInterval:1
                 target:self
                 selector:@selector(doSomething)
                 userInfo:nil
                 repeats:NO
                 ];

 @autoreleasepool {
        BOOL continueProcessingQueue = YES;
        while (continueProcessingQueue) {
            [self performSelectorOnMainThread:@selector(doSomething) withObject:nil waitUntilDone:NO];
            NSDate *curtainTime = [[NSDate alloc] initWithTimeIntervalSinceNow:10];
            NSDate *currentTime = [[NSDate alloc] init];

            while (continueProcessingQueue && ([currentTime compare:curtainTime] != NSOrderedDescending)) {
                if ([self.processThread isCancelled] == YES) {
                    continueProcessingQueue = NO;
                }
                [NSThread sleepForTimeInterval:1];
                currentTime = [[NSDate alloc] init];
            }
        }
    }

タイマーを使用すると、はるかに簡単に思えます。タイマーを使用するよりも 2 番目のアプローチが望ましい状況はありますか?

4

1 に答える 1

0

a) セカンダリ スレッドのアクティブ ステータスを追跡しない場合。スレッドが終了すると、タイマーはそれに伴います。つまり、タイマーが期待するすべてのメッセージを配信しない場合があります。

b) ワーカー スレッドが実行ループを実際にポーリングしていない場合 (長いタスク)、および/またはセカンダリ スレッドの作業が実行ループに制御を戻す頻度が低く、他のスレッドに投稿するマイルストーン/進行状況の精度を高める必要がある場合。ほとんどの場合、セカンダリ スレッドがアイドル状態または待機状態の場合、これは大きな問題ではありません。

実際、ほとんどのシナリオでは、上記のいずれのアプローチも使用すべきではありません。

于 2013-03-05T06:29:08.993 に答える