つまり、継続的に実行されるプロセスがあるが、ユーザーがプロセス操作の特性に影響を与える GUI のパラメーターを変更できる場合、プロセスを配置するのに適した場所はどこNSThread
ですかNSTimer
?
2 に答える
NSThread
とNSTimer
は異なるニーズに対応する 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 をお勧めします。
NSThread と NSTimer は相互に排他的ではなく、相互に置き換えられるものでもありません。NSThread を使用すると、実行のスレッドを制御できます。NSTimer はまさにタイマーです。
メイン スレッドではなく、バックグラウンド スレッドで NSTimer を実行するということですか? これは、メイン スレッドで発生すること (アプリケーションとのユーザー インタラクションなど) によってタイマーが遅延する可能性を少なくするため、一般的には良い考えです。
Apple の Threading Programming Guideを読む必要があります。