2012-08-14 201 views
0

让我首先说我是一个完全的Objective-C新手,并且我正在拾取一个现有的代码库,所以我试图疯狂地阅读有关NSRunLoop等,但我会喜欢一些额外的帮助。在startRunningQTCaptureSession:开始运行阻塞线程

[[NSRunLoop mainRunLoop] runUntilDate:[NSDate distantFuture]]; 
[_captureSession startRunning]; 
return [NSNumber numberWithInt:0]; 

在的应该返回一个函数,而是永远块:

基本上,我继承的代码看起来像。我需要这个返回,我不知道为什么它阻止。一些分散的代码可能会有所帮助:

_captureDecompressedVideoOutput = [[QTCaptureDecompressedVideoOutput alloc] 
            init]; 
[_captureDecompressedVideoOutput setDelegate:self]; 
[_captureDecompressedVideoOutput performSelectorOnMainThread:@selector(setPixelBufferAttributes:) withObject:captureDictionary waitUntilDone:NO]; 

任何想法发生了什么?

回答

0

好,我卡住[_captureSession startRunning]在一个单独的函数,然后替换

self performSelectorInBackground:@selector(backgroundCapture) withObject:nil]; 

因此它在一个线程运行了呼叫。不仅阻塞不会干扰返回的方法(因为它在一个单独的线程上),而且现在调用并没有阻止它在它自己的线程上运行。离奇。

+0

我在OSX 10.8上使用XCode 4.5在QTCapture会话中看到了一些类似的怪异行为。我发现[这个示例命令行应用程序]运行正常,但只有当它使用[NSThread启动]运行... 我刚刚开始使用AVCaptureSession(我知道这是iOS上可用,但最近才意识到也可用在Mac上),这更直截了当。 (我碰到的唯一呃逆是你必须说“setWantsLayer”和“setLayer”来给出一个CALayer的视图,以便与AVCaptureVideoPreviewLayer一起使用。)我还了解到AVCaptueSession应该取代QTCaptureSession ... – bellkev 2012-10-31 07:12:10