2009-11-27 27 views
109

không ai biết nếu nó có thể hủy bỏ đã được xếp hàng đợi sự kiện chọn từ ngăn xếp sự kiện hoặc hẹn giờ stack (hoặc bất cứ cơ chế nó được sử dụng bởi API) khi bạn gọi performSelector:withObject:afterDelay?hủy bỏ hàng đợi thực hiệnSelector: afterDelay gọi

Tôi đã sử dụng ngăn xếp sự kiện này để thay đổi các thuộc tính của hình ảnh trong tab TabBar và đôi khi sẽ có giá trị thay đổi trong vòng 10 giây trong một vòng lặp ... có thể là 5 mili giây.

vấn đề phát sinh nếu người dùng chuyển tab ... như nói rằng tôi có thay đổi hình ảnh xếp hàng đợi cho hình ảnh được hiển thị ngay khi Tab # 4 được bật và sau đó người dùng nhanh chóng chuyển sang Tab # 3 và sau đó quay lại Tab # 4 ... điều này sau đó sẽ xếp lại 10 giây thay đổi khác trong khi hàng đợi cũ vẫn đang phát, có thể khoảng 2 hoặc 3 giây trong hàng đợi nếu chuyển đủ nhanh ... nhưng thậm chí là đến 5 giây trong luồng là một vấn đề.

vì vậy tôi cần một số cách để hủy bỏ chồng cũ của những thay đổi trước khi đưa một chồng mới về ...

Tôi đang viết truy vấn này ở thì quá khứ vì tôi đã đưa ra một giải pháp thay thế này vấn đề bằng cách thêm một bộ lọc sự kiện hawk-eyed vào chức năng phát lại. tuy nhiên tôi vẫn tò mò nếu hủy bỏ sự kiện là có thể, bởi vì tôi có cảm giác kiến ​​thức như vậy sẽ có ích trong tương lai. cảm ơn bạn mọi giúp đỡ :)

+0

làm thế nào bạn có thể sử dụng bộ lọc sự kiện diều hâu mắt vào chức năng phát lại? –

Trả lời

227
[NSObject cancelPreviousPerformRequestsWithTarget:] 

hoặc

[NSObject cancelPreviousPerformRequestsWithTarget:selector:object:] 

Các target là đối tượng ban đầu mà performSelector:afterDelay: được gọi.

Ví dụ:

// schedule the selector 
[self performSelector:@selector(mySel:) withObject:nil afterDelay:5.0]; 
// cancel the above call (and any others on self) 
[NSObject cancelPreviousPerformRequestsWithTarget:self]; 

Xem apple docs, nó ở ngay ở phần cuối của mô tả performSelector:withObject:afterDelay:.

+33

Đối với một số làm rõ về việc sử dụng nó, hãy thử điều này: [NSObject cancelPreviousPerformRequestsWithTarget: self]; – dnstevenson

+2

Đã chỉnh sửa để sử dụng nhận xét của bạn - cảm ơn dnstevenson! – Tim

+0

Câu trả lời tuyệt vời! – pmk

1

Kiểm tra tài liệu NSRunLoop. Bạn muốn -cancelPerformSelectorsWithTarget:

2

Nếu bạn đang tìm kiếm "performSelector" để có kết hợp "cancelPreviousPerformSelector" ... nó không. (Ugh, Apple, tại sao bạn làm điều đó với tôi ???)

Các, er, ah, "phù hợp với" phương pháp là: performSelector cancelPreviousPerformRequestsWithTarget

(Chỉ cần để làm cho nó thêm khó khăn để nhớ, . mà không cần tìm kiếm các tài liệu)

2

để hủy bỏ tất cả thực hiện yêu cầu trước đó, bạn có thể sử dụng:

[NSObject cancelPreviousPerformRequestsWithTarget:self]; 
Các vấn đề liên quan