8

Cách thích hợp để thực hiện việc này là gì? Các tài liệu NSTimer nói điều này:Có an toàn để lên lịch và vô hiệu hóa NSTimers trên hàng đợi nối tiếp GCD không?

cân nhắc đặc biệt

Bạn phải gửi thông điệp này từ các chủ đề trên mà hẹn giờ đã được cài đặt. Nếu bạn gửi tin nhắn này từ một luồng khác , nguồn đầu vào được kết hợp với bộ hẹn giờ có thể không bị xóa khỏi vòng lặp chạy của nó, điều này có thể ngăn luồng thoát khỏi trạng thái đúng cách.

Kể từ GCD không đảm bảo với bạn rằng một hàng đợi nối tiếp sẽ luôn luôn chạy khối trên cùng một sợi, đúng cách là những gì để đảm bảo rằng bạn sắp xếp và làm mất hiệu lực một NSTimer trên cùng một sợi?

EDIT:

Sau khi tư vấn cho các câu trả lời dưới đây, tôi tạo MSWeakTimer (https://github.com/mindsnacks/MSWeakTimer) mà là một phong tục hẹn giờ thực hiện sử dụng GCD có thể được sử dụng từ bất kỳ hàng đợi.

+0

+1 cho MSWeakTimer ... Đã giải quyết được vấn đề về bộ nhớ khủng khiếp của chúng tôi! – jowie

Trả lời

9

Bạn không nên cài đặt NSTimer trên chuỗi công nhân ẩn danh do GCD quản lý.

Sử dụng nguồn hẹn giờ công văn với GCD thay vì NSTimer, c.f. dispatch_source_create (3).

NSTimer dựa vào runloop của chuỗi hiện tại, đây không phải là điều có ý nghĩa đối với hàng đợi GCD. Xem phiên GDC WWDC2012 để biết thêm chi tiết về GCD và API runloop.

+0

Điều đó tạo ra rất nhiều ý nghĩa. Tôi đoán ngoại lệ duy nhất sẽ là hàng đợi chính, tôi có đúng không? –

+0

chính xác, miễn là một quá trình không gọi dispatch_main (3), runloop chính và hàng đợi chính được gắn và đảm bảo thực thi trên thread chính. – das

+1

https://github.com/mindsnacks/MSWeakTimer –

Các vấn đề liên quan