2012-08-10 51 views
3

我使用ZXing作爲應用程序,除了我允許在一行中掃描幾次(即,ZXingWidgetController不是隻要檢測到某種東西,就會被迫退出)。AVCaptureSession - 停止運行 - 需要很長的時間

我經歷了很長很長凍結(有時它永遠不會結束)當我按下解僱按鈕調用

- (void)cancelled { 
    // if (!self.isStatusBarHidden) { 
    //  [[UIApplication sharedApplication] setStatusBarHidden:NO]; 
    // } 

    [self stopCapture]; 

    wasCancelled = YES; 
    if (delegate != nil) { 
     [delegate zxingControllerDidCancel:self]; 
    } 


} 

- (void)stopCapture { 
    decoding = NO; 
#if HAS_AVFF 


    if([captureSession isRunning])[captureSession stopRunning]; 
    AVCaptureInput* input = [captureSession.inputs objectAtIndex:0]; 
    [captureSession removeInput:input]; 
    AVCaptureVideoDataOutput* output = (AVCaptureVideoDataOutput*)[captureSession.outputs objectAtIndex:0]; 
    [captureSession removeOutput:output]; 
    [self.prevLayer removeFromSuperlayer]; 

    /* 
    // heebee jeebees here ... is iOS still writing into the layer? 
    if (self.prevLayer) { 
    layer.session = nil; 
    AVCaptureVideoPreviewLayer* layer = prevLayer; 
    [self.prevLayer retain]; 
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 12000000000), dispatch_get_main_queue(), ^{ 
    [layer release]; 
    }); 
    } 
    */ 

    self.prevLayer = nil; 
    self.captureSession = nil; 
#endif 
} 

(請注意是刪除該視圖的dismissModalViewController是在委託方法內)

我只有在解鎖時纔會遇到凍結,只有當我連續進行多次掃描時,才使用iPhone 4(no用4S凍結)

任何想法?

乾杯

+0

很難提供任何建設性的。 UIKit會變得非常困惑,如果您從主線程中調用,則會執行此類操作,但是您的描述中沒有任何內容會顯示證據。否則,沒有任何已知的原因會以你描述的方式掛起,並且在你寫的東西中沒有任何明顯的表現。所以它可能是沒有顯示的東西,唯一的方法是調試它... – smparkes 2012-08-13 16:48:23

+0

我發現這不是一個問題,因爲iOS 9 – onmyway133 2016-05-04 07:29:01

回答

22

按照AV Cam View Controller Example調用startRunning或stopRunning不返回,直到會話完成請求的操作。由於您正在將這些消息發送到主線程上的會話,因此它會凍結所有UI,直到請求的操作完成。我建議你將你的調用包裝在一個異步調度中,以便視圖不鎖定。

- (void)cancelled 
{ 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     [self stopCapture]; 
    }); 

    //You might want to think about putting the following in another method 
    //and calling it when the stop capture method finishes 
    wasCancelled = YES; 
    if (delegate != nil) { 
     [delegate zxingControllerDidCancel:self]; 
    } 
} 
+3

請小心! 'stopCapture'根據上面的代碼操作視圖層次結構。切勿從GUI線程之外操作GUI。 – Krumelur 2012-10-22 20:36:10

+0

啊好趕上@Krumelur是[self.prevLayer removeFromSuperlayer]調用應該在主線程 – Endama 2012-10-22 20:47:25

+0

感謝您的答案。我知道我有點晚了,但幫助非常有用! – 2013-03-23 17:06:16