sıraya alınmış performSelector: afterDelay çağrılarını iptal etme


115

Aradığınızda olay yığınından veya zamanlayıcı yığınından (veya API tarafından kullanılan mekanizma ne olursa olsun) zaten sıraya alınmış seçici olayları iptal etmenin mümkün olup olmadığını bilen var performSelector:withObject:afterDelaymı?

Bu olay yığınını bir TabBar sekmesindeki bir görüntünün özniteliklerini değiştirmek için kullanıyordum ve bazen döngü için hızlı bir şekilde yürütülen bir döngüde 10 saniyeye kadar değerde değişiklik sıraya koyuyordum ... belki 5 milisaniye kadar.

sorun, kullanıcı sekmeleri değiştirirse ortaya çıkar ... örneğin, Sekme # 4 etkinleştirilir etkinleştirilmez görüntülenen bir resim için sıraya alınmış resim değişikliklerini yaptım ve ardından kullanıcı hızlı bir şekilde Sekme # 3'e ve ardından hemen Sekmeye dönüyor # 4 ... bu, daha sonra eski sıra çalınırken, muhtemelen kuyruğa yeterince hızlı geçilirse yaklaşık 2 veya 3 saniye içinde 10 saniyelik bir değişiklik daha sıraya koyar ... akış bir sorundu.

bu yüzden yeni bir yığın koymadan önce eski değişiklik yığınını iptal etmek için bir yola ihtiyacım vardı ...

Bu sorguyu geçmiş zamanda yazıyorum çünkü oynatma işlevine şahin gözlü bir olay filtresi ekleyerek bu soruna alternatif bir çözüm buldum. ancak yine de olay iptalinin mümkün olup olmadığını merak ediyorum, çünkü gelecekte böyle bir bilginin işe yarayacağına dair bir his var. herhangi bir yardım için teşekkür ederim :)


oynatma işlevinde şahin gözlü olay filtresini nasıl kullanabilirsiniz?
Maniganda saravanan

Yanıtlar:


241
[NSObject cancelPreviousPerformRequestsWithTarget:]

veya

[NSObject cancelPreviousPerformRequestsWithTarget:selector:object:]

targetHangi orijinal nesnedir performSelector:afterDelay:denirdi.

Örneğin:

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

Apple belgelerine bakın , performSelector:withObject:afterDelay:açıklamanın hemen sonunda .


33
Kullanımı hakkında biraz açıklama için şunu deneyin: [NSObject cancelPreviousPerformRequestsWithTarget: self];
dnstevenson

[NSObject cancelPreviousPerformRequestsWithTarget: kendi kendine seçici: @selector (mySel :) nesne: nil];
webtrick101

2

Önceki tüm gerçekleştirme isteklerini iptal etmek için şunları kullanabilirsiniz:

[NSObject cancelPreviousPerformRequestsWithTarget:self];   

2

"" İle eşleşen "performSelector" arıyorsanız cancelPreviousPerformSelector... öyle değildir. (Ugh, Apple, bunu bana neden yapıyorsun ???)

, Er, ah, "eşleştirme" yöntemleri şunlardır:

performSelector

cancelPreviousPerformRequestsWithTarget

(Belgeleri aramadan hatırlamayı daha da zorlaştırmak için.)


1

NSRunLoop belgelerine bakın. İstediğiniz-cancelPerformSelectorsWithTarget:

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.