我正在寫一個簡單的應用程序,應該能夠使用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