2012-02-22 34 views
6

tôi đang sử dụng các phương pháp sau đây trong một phân lớp UIView:performSelector afterdelay không làm việc

[self performSelector:@selector(timeout) withObject:nil afterDelay:20]; 

Phương pháp này được gọi là sau 20 giây như mong đợi. Trong phương pháp khác tôi cố gắng để hủy bỏ thực hiện theo yêu cầu sử dụng đoạn mã sau:

[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(timeout) object:nil]; 

tôi cũng đã cố gắng

[NSRunLoop cancelPreviousPerformRequestsWithTarget:self selector:@selector(timeout) object:nil]; 

cả các tin nhắn không mang lại kết quả mong đợi một phương pháp thời gian chờ vẫn là gọi là. ai có thể giải thích cho tôi những gì tôi đang làm sai và làm thế nào để làm điều đó đúng cách?

cổ vũ từ Áo martin

+0

hoạt động tốt, tôi vừa thử mã của bạn –

Trả lời

3

Hai điểm
1. Are cả self cùng đối tượng ??
2. Có phải [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(timeout) object:nil]; được thực hiện trên cùng một chuỗi mà bạn gọi là [self performSelector:@selector(timeout) withObject:nil afterDelay:20]; không?

Kiểm tra hai vấn đề này.

1

Bạn có thể làm điều đó với 2 cách:

  1. Bạn có thể sử dụng này mà sẽ loại bỏ tất cả xếp hàng đợi

    [NSObject cancelPreviousPerformRequestsWithTarget: tự];

  2. bạn có thể xóa từng người

    [NSObject cancelPreviousPerformRequestsWithTarget: tự selector: @selector (timeout) đối tượng: nil];

3

Sử dụng NSTimer được lưu trữ làm biến mẫu trong lớp học của bạn. Khi bạn muốn hủy bỏ việc thực hiện, làm mất hiệu lực và hủy bỏ bộ hẹn giờ.

Trong @ interface của bạn:

@property (readwrite, retain) NSTimer *myTimer; 

Trong @implementation của bạn:

self.myTimer = [NSTimer scheduledTimerWithTimeInterval:20 target:self selector:@selector(timeout) userInfo:nil repeats:NO]; 

Sau đó, nếu một số điều kiện xảy ra và phương pháp timeout nên không còn được gọi là:

[self.myTimer invalidate]; 
self.myTimer = nil; // this releases the retained property implicitly 
1

Hãy thử cách này:

[self performSelectorOnMainThread:@selector(timeout) withObject:self waitUntilDone:NO]; 
Các vấn đề liên quan