Có cách nào để hủy dispatch_after() được lên lịch một thời gian trong tương lai và chưa bắn cho đến nay không? Tôi đang cố gắng tạo một thứ gì đó giống như một bộ lập lịch để cập nhật từ máy chủ và phương pháp này cũng giống như tôi muốn, nhưng tôi rất muốn hủy và lên lịch lại vào một thời điểm nào đó. Tôi có thể dự phòng và sử dụng NSTimer không?hủy phương thức dispatch_after()?
Trả lời
Sử dụng nguồn bộ hẹn giờ công văn (đó là những gì dispatch_after
sử dụng nội bộ anyway).
Có thể hủy nguồn hẹn giờ công văn hoặc thay đổi thông số bộ đếm thời gian sau khi tạo.
Không có cách nào để ngăn dispatch_block thực hiện khi nó đã được gửi đến hàng đợi của nó, có nghĩa là dispatch_after của bạn không thể bị hủy bỏ. Chỉ có tùy chọn là thêm vào khối của bạn một điều kiện để được kiểm tra trong thời gian chạy để ngăn chặn thực thi. tức là.
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 10 * NSEC_PER_SEC), dispatch_get_main_queue(),^{
if(self.shouldExecuteDispatchBlock)
{ // do your stuff } });
Hmmm vì vậy cho đến khi thời gian tiếp theo để thực hiện khối này xuất hiện (và nó được thiết lập để được hủy bỏ), tôi đoán nó sẽ hog tất cả các bộ nhớ/đối tượng cho đến khi đó. Có thể một vấn đề nếu chu kỳ của bạn là như 60 phút? :-) – Jonny
Có và không. Khối sao chép bộ nhớ, có nghĩa là nếu bạn yêu cầu giá trị int trong khối của mình, khối này sẽ được sao chép và sẽ nằm trong bộ nhớ dưới dạng bản sao miễn là khối đó hoạt động. Nhưng đối với đối tượng, nó không sao chép chúng, nó sao chép địa chỉ. Nếu bạn muốn một hình ảnh, bạn sẽ có một đối tượng UIImage trong heap nhưng khối sẽ chỉ giữ lại một giá trị con trỏ (8 byte trong arch64) vì vậy, không có biggie. Tất nhiên hình ảnh sẽ được giữ lại trong bộ nhớ cho đến khi khối này biến mất, vì vậy nó sẽ không được sạch bởi vòng cung. –
Tôi đã biến điều này thành phần mở rộng cho DispatchQueue: https://github.com/nrbrook/DispatchAfterCancellable – Nick
OK, vì vậy, với tất cả các câu trả lời thu được, và giải pháp khả thi, có vẻ như tốt nhất cho trường hợp này (bảo quản đơn giản) đang kêu gọi performSelector:withObject:afterDelay:
và hủy bỏ nó với cancelPreviousPerformRequestsWithTarget:
cuộc gọi khi mong muốn. Trong trường hợp của tôi - ngay trước khi lên kế hoạch tiếp theo trì hoãn cuộc gọi:
[NSObject cancelPreviousPerformRequestsWithTarget: self selector:@selector(myDelayedMethod) object: self];
[self performSelector:@selector(myDelayedMethod) withObject: self afterDelay: desiredDelay];
Tôi bắt đầu xuống đường dẫn này, nhưng làm thế nào để làm điều đó với các phương thức lớp (đó là lý do tại sao tôi chuyển sang 'dispatch_after')? – Olie
@Olie tốt nhất. Sau đó, bạn phải bao bọc các cuộc gọi đó, hoặc sử dụng dispatch + flag (đoán, giây sẽ đơn giản hơn) –
Đối với mục đích này tôi sử dụng lớp này:
https://github.com/SebastienThiebaud/dispatch_cancelable_block
bạn có thể gọi một hủy() để hủy bỏ việc thực hiện những gì trong khối.
Nếu bạn sử dụng nó trong Swift - bạn có thể xem nó tại đây https://github.com/katleta3000/CancelBlocks/ – katleta3000
- 1. dispatch_after versus performSelector afterDelay
- 2. dispatch_after tương đương trong NSOperationQueue
- 3. Trình biên dịch có hủy các phương thức trống không?
- 4. phương thức chưa xác định `hủy 'cho nil: NilClass
- 5. Meteor - Hủy một phương thức máy chủ từ máy khách
- 6. Ngăn tác vụ nền dispatch_after() bị thi hành
- 7. Cách hủy báo thức từ AlarmManager
- 8. Hủy báo thức đơn khi bạn có nhiều báo thức
- 9. Phương thức hủy diệt ActiveRecord trả về giá trị boolean trong Ruby on Rails?
- 10. Gọi phương thức ảo từ trình phá hủy - giải pháp thay thế?
- 11. Emberjs hủy bỏ quá trình chuyển đổi và hiển thị phương thức
- 12. Tôi có thể gọi hàm hủy từ phương thức lớp của nó không?
- 13. Cách đính kèm CancellationTokenSource vào phương thức DownloadStringTaskAsync và hủy cuộc gọi không đồng bộ?
- 14. Phương thức gọi để hủy kết nối từ ứng dụng web Java
- 15. Sự khác biệt giữa hàm hủy, xử lý và hoàn thiện phương thức
- 16. Phương thức hủy của mô hình Backbone.js không kích hoạt thành công hoặc lỗi sự kiện
- 17. Rake đang hủy bỏ vì phương thức chưa xác định `inet '
- 18. Đảm bảo tất cả các phương thức TThread.Queue hoàn thành trước khi tự hủy lệnh
- 19. Gửi mã thông báo hủy đến phương thức gọi hàm tạo VS nhiệm vụ?
- 20. Rake được hủy bỏ vì phương thức undefined `inet 'cho sqlite db
- 21. Có phương pháp tiêu hủy cho FlexSlider
- 22. IOS Hủy Thông báo Địa phương
- 23. Kích hoạt phụ thuộc:: phá hủy với phương pháp hủy diệt bị ghi đè
- 24. UISearchDisplayController - Phương pháp cho khi nút hủy được nhấp
- 25. Tham số phương thức init mùa xuân
- 26. Phương thức trả về phương thức: bool, string, const ... (PHP)
- 27. Phương thức gọi bên trong phương thức khác trong javascript?
- 28. Tự động gán phương thức/Phương thức như biến
- 29. Mở phương thức bên trong một phương thức
- 30. Phương thức và phương thức Scala dưới dạng tham số
yup. có vẻ như chúng tôi có bản sao. Tự hỏi liệu có thể hợp nhất các câu hỏi này không? –