我正在编写一个简单的应用程序,应该能够使用苹果的CoreFoundation框架在后台线程接收和处理通知。以下是我的目标:
如果我运行程序,只会得到以下结果:
问题在于后台线程的运行循环立即退出(返回码为kCFRunLoopRunFinished而不是kCFRunLoopRunTimedOut),因为没有源/观察者/计时器。CFNotificationCenterAddObserver仅向主线程的运行循环注册,而不是我的后台线程的运行循环。
我需要主线程来处理其他事情,不能使用它来运行它的运行循环。有没有办法让这个工作?也许通过将CFNotificationCenter注册到后台线程的运行循环中?
提前感谢!
static void DummyCallback(CFNotificationCenterRef center,
void *observer,
CFStringRef name,
const void *object,
CFDictionaryRef userInfo) {
printf("RECEIVED NOTIFICATION\n");
}
void *ThreadStart(void *arg) {
CFNotificationCenterAddObserver(CFNotificationCenterGetDistributedCenter(),
NULL,
&DummyCallback,
NULL,
CFSTR("TEST_OBJECT"),
CFNotificationSuspensionBehaviorDeliverImmediately);
printf("background thread: run run loop (should take 5 sec to exit)\n");
int retval = CFRunLoopRunInMode(kCFRunLoopDefaultMode, 5, true);
printf("background thread: exited from run loop (retval: %d)\n", retval);
return NULL;
}
int main(int argc, char** argv) {
pthread_t thread;
int rc = pthread_create(&thread, NULL, &ThreadStart, NULL);
assert(rc == 0);
printf("main: sleep\n");
sleep(10);
printf("main: done sleeping\n");
return 0;
}
如果我运行程序,只会得到以下结果:
main: sleep
background thread: run run loop (should take 5 sec to exit)
background thread: exited from run loop (retval: 1)
main: done sleeping
问题在于后台线程的运行循环立即退出(返回码为kCFRunLoopRunFinished而不是kCFRunLoopRunTimedOut),因为没有源/观察者/计时器。CFNotificationCenterAddObserver仅向主线程的运行循环注册,而不是我的后台线程的运行循环。
我需要主线程来处理其他事情,不能使用它来运行它的运行循环。有没有办法让这个工作?也许通过将CFNotificationCenter注册到后台线程的运行循环中?
提前感谢!