2012-02-22 10 views
6

çalışmıyor afterdelay: beklendiği gibiperformselector UIView alt sınıfında, aşağıdaki yöntem kullanılarak am

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

yöntem, 20 saniye sonra, olarak adlandırılır. Her iki iletiler zaman aşımı yöntemi hala beklenen sonucu üzme

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

ben de

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

denedim: Başka bir yöntemde i aşağıdaki kodu kullanarak isteği gerçekleştirmek iptal etmek deneyin aradı. kimse bana neyi yanlış yaptığımı ve nasıl doğru şekilde yapılacağını açıklayabilir mi? avusturya martin

den

şerefe

+0

iyi çalışıyor, sadece kodunuzu denedim –

cevap

3

iki nokta
1. Her iki self aynı nesne ise ??
2. [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(timeout) object:nil];, [self performSelector:@selector(timeout) withObject:nil afterDelay:20]; olarak adlandırdığınız aynı iş parçacığında gerçekleştiriliyor mu?

Bu iki sorunu kontrol edin.

1

Sen yapabileceği 2 yolları:

  1. Hepiniz

    sıraya kaldırmak hangi kullanabiliriz

    [NSObject cancelPreviousPerformRequestsWithTarget: kendinden];

  2. her birini kaldırabilir
  3. ayrı

    [NSObject cancelPreviousPerformRequestsWithTarget: kendinden seçici: @selector (zaman aşımı) nesne: nil];

3

Sınıfınızda örnek değişken olarak saklanan bir NSTimer kullanın. İşlemi iptal etmek istediğinizde, zamanlayıcıyı geçersiz kılın ve yok edin. senin @implementation olarak

@property (readwrite, retain) NSTimer *myTimer; 

: senin @interface olarak

bazı koşul olur ve eğer

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

Sonra zaman aşımı yöntem artık çağrılmalıdır:

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

Bunu deneyin:

[self performSelectorOnMainThread:@selector(timeout) withObject:self waitUntilDone:NO];