我正在創建一個用於iOS的C++庫(是的,不幸的是它必須是C++),它使用AVCaptureSession捕獲通過captureOutput回調傳遞的視頻幀。 C++庫是我的可交付產品。我有一個可可觸摸應用程序來測試/演示它。因此,它看起來像這樣:NSRunLoop和GCD隊列
(測試應用程序)< ----->(C++ LIB(AVFoundation回調))
測試程序具有UI控件,並負責幾乎所有的圖形。 C++庫通過OpenGL將幀呈現給UIView。
你跟我嗎?好
好吧,首先,用戶按下一個UIButton,它會打電話到我的圖書館。此通話需要10秒或更長時間才能完成。所以,如果我把電話直接單擊按鈕背後,用戶界面將被阻止,直到庫函數返回:
-(IBAction)hBut:(id)sender{
[myLib foo]; // takes 10+ seconds to return
}
這也是白搭。我想接下來的事情就是產生一個線程調用的lib:
-(void)callIntoLib{
[myLib foo];
}
-(IBAction)hBut:(id)sender{
[NSThread detach..:myLib selector:foo object:nil];
}
此不再阻止用戶界面,但現在的視頻幀回調函數永遠不會觸發(AVCaptureSession的captureOutput)。看起來好像主要的NSRunLoop已被阻止。
接下來我想同樣的事情,但與大中央調度:
-(IBAction)hBut:(id)sender{
_myQueue = dispatch_queue_create("com.domain.me", NULL); // member variable
dispatch_async(_myQueue,
^{
[myLib foo];
});
}
此具有相同的行爲。也就是說,視頻幀的回調不會觸發。 Lame
爲什麼主要的NSRunLoop在第二和第三種情況下被阻塞?有沒有辦法將隊列與它關聯?
這是否有意義?
這個李k現在已經壞了(蘋果的邪惡站長不斷破壞url)。新版本位於:https://developer.apple.com/library/ios/qa/qa1702/_index.html – Adam 2013-08-27 13:51:36
看來即使線程有自己的runloop,'AVCaptureSession'堅持在主runloop上運行(' CFRunLoopGetMain')。我[產生NSThread](https://github.com/dashesy/pyavfcam/blob/develop/src/modules/avf_impl.m)並運行其中的所有內容,但回調只來自主runloop,如果主runloop被阻塞,沒有收到回叫。如果我在主循環中執行所有操作,那麼一切都很好,只是它不喜歡新線程。我正在談論的不是iOS的OSX。 – dashesy 2015-09-23 01:05:03