Tôi đang theo Hướng dẫn lập trình hàng đợi âm thanh trên iOS - Phát âm thanh ". Gần cuối của hướng dẫn, có cuộc gọi đến CFRunLoopRunInMode()
trong bước Start and Run an Audio Queue:Tại sao gọi đến CFRunLoopRunInMode() trong Mã Phát lại Hàng đợi Âm thanh?
do { // 5
CFRunLoopRunInMode ( // 6
kCFRunLoopDefaultMode, // 7
0.25, // 8
false // 9
);
} while (aqData.mIsRunning);
//...
Các tài liệu về dòng 6 nói: "Chức năng CFRunLoopRunInMode chạy vòng lặp chạy có chứa chủ đề hàng đợi âm thanh của." Nhưng đó không phải là chạy vòng lặp thực hiện anyways khi phương pháp của tôi trở về? Đoạn mã trên được thực thi bởi chuỗi chính khi nhấn nút phát trong ứng dụng của tôi.
Hiện tại tôi đang gặp khó khăn khi hiểu những lời gọi này đến CFRunLoopRunInMode()
là tốt, bởi vì chúng có bất lợi khi nút phát của tôi không cập nhật chính xác (nó sẽ được nhấn xuống trong suốt thời gian phát âm thanh) và không có hiệu ứng tích cực, tức là âm thanh cũng phát độc đáo nếu tôi xóa vòng lặp do-while khỏi mã của tôi cùng với các cuộc gọi đến CFRunLoopRunInMode()
và thay vào đó trực tiếp quay trở lại từ phương thức này. Điều này chỉ ra giải pháp rõ ràng để đơn giản giữ các cuộc gọi này bị xóa vì điều này không gây ra sự cố. Ai đó có thể giải thích tại sao mã này được bao gồm trong hướng dẫn chính thức của Apple về việc sử dụng Hàng đợi âm thanh trong iOS để phát lại âm thanh không?
Edit:
Tôi chỉ thấy rằng trong Mac OS X, tồn tại cùng một hàng đợi API âm thanh như trên iOS, và các hướng dẫn dành cho iOS có vẻ là một copy-paste trùng lặp của Mac OS guide. Điều này dẫn tôi đến sự nghi ngờ rằng các cuộc gọi đến vòng lặp chạy này chỉ được yêu cầu trong Mac OS và không còn trong iOS, ví dụ: bởi vì nếu không, ứng dụng Mac OS sẽ thoát hoặc tương tự như vậy. Ai đó có thể vui lòng xác minh điều này hoặc loại trừ nó?
Tôi nghĩ rằng bạn là chính xác: với tôi, điều này chỉ trông giống như mã mẫu cho một ứng dụng độc lập (dòng lệnh?) Mà không * gì khác * nhưng chơi một tệp âm thanh để hoàn thành. Trong một ứng dụng "thực", không cần phải chạy vòng lặp chạy "thủ công". FWIW, tôi sử dụng AudioQueues và không bao giờ nhận thấy rằng mã mẫu, và không bao giờ gọi 'CFRunLoopRunInMode()' trong một vòng lặp như thế. – bunnyhero