我正在编写一个 Cocoa 应用程序,其 GUI 是在 Interface Builder 中设计的。我需要在不阻塞 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];
}
我保留了计时器,因此我可以轻松地使计时器无效并重新安排时间。
问题:我还必须触发 run: 方法以响应 GUI 事件,因此它是同步的(即“执行活动”按钮)。像这样:
[timer fire];
我也可以使用 performSelectorInBackground 来做到这一点,当然它不会阻塞 UI。但是这种同步触发在另一个运行循环中运行!所以我不能保证它们不会重叠。如何在同一个运行循环中将所有触发排队?