Interface Builder で設計された GUI を使用して、Cocoa アプリケーションを作成しています。UI をブロックせずに (定期的に) バックグラウンド アクティビティをスケジュールする必要があるため、次のように別のスレッドで実行します。
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
[self performSelectorInBackground:@selector(schedule) withObject:nil];
}
- (void) schedule {
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
NSRunLoop* runLoop = [NSRunLoop currentRunLoop];
timer = [[NSTimer scheduledTimerWithTimeInterval:FEED_UPDATE_INTERVAL
target:activityObj
selector:@selector(run:)
userInfo:nil
repeats:YES]
retain];
[runLoop run];
[pool release];
}
タイマーを保持しているので、簡単に無効にして再スケジュールできます。
問題: GUI イベントに応答して run: メソッドも起動する必要があるため、これは同期的です (つまり、「アクティビティを実行する」ボタン)。このような:
[timer fire];
performSelectorInBackground でもこれを行うことができ、もちろん UI をブロックしません。しかし、この同期発火は別の実行ループで実行されます! したがって、それらが重複しないという保証はありません。同じ実行ループですべての発火をキューに入れるにはどうすればよいですか?