2013-07-03 29 views
5

tôi tạo một phiên làm việc mới, và bắt đầu nó trên iPhone như thế này:dừng AVCaptureSession iPhone mất 8 giây

AVCaptureSession* session; 
... 
[session startRunning]; 

này hoạt động tốt. Tuy nhiên, dừng phiên sau:

[session stopRunning]; 

Mất khoảng 8 giây thường! Có ai biết tại sao điều này là có thể và những gì có thể được thực hiện để làm cho nó nhanh hơn?

+1

Hãy thử cách này: http: //stackoverflow.com/questions/11905505/avcapturesession-stop-running-take-a-long-long-time – nickcheng

+1

Có, điều này dường như giải quyết được vấn đề. Khi bạn thêm nó làm câu trả lời, tôi sẽ chấp nhận nó. –

Trả lời

2

Tôi đã gặp sự cố tương tự. Gọi stopRunning sẽ đóng băng ứng dụng trong 8 đến 10 giây.

Tôi cuối cùng đã theo dõi vấn đề này: Tôi đã gọi stopRunning trên một chủ đề khác với chủ đề chính. Chủ đề thứ cấp này được sử dụng cho tất cả các giao dịch cho AVCaptureSession. Vấn đề xảy ra bởi vì sau khi gửi cuộc gọi đến stopRunning, tôi đã chặn chủ đề chính đang chờ nó hoàn tất. Thật không may, stopRunning gửi một cái gì đó đến chủ đề chính và các khối chờ đợi cho rằng để hoàn thành. Điều stopRunning đã chờ đợi trên cuối cùng hết thời gian và báo cáo lỗi trong - (void) onRuntimeError: (NSNotification *) n gọi lại: Tên miền lỗi = AVFoundationErrorDomain Code = -11819 "Không thể hoàn thành hành động" UserInfo = 0x19e43c90 {NSLocalizedRecoverySuggestion = Thử lại sau đó., NSLocalizedDescription = Không thể hoàn thành hành động}

Giải pháp trong trường hợp của tôi không đơn giản là không chặn luồng chính sau khi gọi stopRunning. May mắn thay cho tôi đó là dễ dàng để làm (và một cái gì đó Apple nhiều hơn hoặc ít hơn đề nghị anyway).

Tôi đã nhận thấy các biến thể về chủ đề này trong các câu hỏi khác và giải pháp luôn là làm lại mã. Hy vọng rằng điều này sẽ cung cấp một sự hiểu biết tốt hơn về lý do tại sao vấn đề đang xảy ra.

+0

Điều này khiến tôi nhận thấy rằng tôi đã gọi startRunning() trong ứng dụng của tôi ngoài chủ đề chính đã gây ra sự chậm trễ lâu trước khi phiên bắt đầu. Tôi đã thay đổi nó để chạy trên thread chính và nó hoạt động lại một lần nữa. –

3

Từ các tài liệu của Apple:

Discussion

This method is used to stop the flow of data from the inputs to the outputs connected to the AVCaptureSession instance that is the receiver. This method is synchronous and blocks until the receiver has completely stopped running.

Bởi vì đó là đồng bộ, bạn có thể đặt nó vào một cuộc gọi async để tránh đóng băng thread UI.


Thêm nhiều nhận xét:

Ý tưởng trên đã không làm cho stopRunning nhanh hơn. Nó chỉ dừng đóng băng luồng giao diện người dùng.