我正在写一个简单的应用程序,应该能够使用Apple的CoreFoundation框架在后台线程中接收和处理通知。这里就是我试图完成:CoreFoundation:在后台线程接收/处理通知
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
的问题是,后台线程的run loop立即退出(返回代码kCFRunLoopRunFinished代替kCFRunLoopRunTimedOut ),因为没有源/观察者/定时器。 CFNotificationCenterAddObserver只注册主线程的运行循环,而不是我的后台线程。
我需要一些其他东西的主线程,不能用它来运行它的运行循环。有什么办法可以使这个工作?也许通过注册CFNotificationCenter与后台线程的运行循环?
在此先感谢!
感谢您的回答。我也读过那篇文章,但这并不能解决我的问题。为了接收通知,主线程中需要CFRunLoop。应该有办法解决这个问题。 – Benjamin
实现您自己的通知中心,该中心将关注线程的运行循环。 – Andrew
也想到了这一点,但我无法弄清楚如何将它连接到distnote守护进程。核心基金会的这部分似乎是封闭的来源。而且我不确定未来的解决方案将如何。苹果公司可能会在某些时候改变一些内部零件 – Benjamin