membatalkan antrian performSelector: panggilan afterDelay

115

apakah ada yang tahu apakah mungkin untuk membatalkan event selector yang sudah antri dari event stack atau timer stack (atau mekanisme apa pun yang digunakan oleh API) saat Anda menelepon performSelector:withObject:afterDelay?

Saya menggunakan tumpukan acara ini untuk mengubah atribut gambar dalam tab TabBar, dan terkadang mengantri hingga 10 detik untuk perubahan dalam satu perulangan dengan cepat ... mungkin 5 milidetik atau lebih.

masalah muncul jika pengguna beralih tab ... seperti katakanlah saya memiliki perubahan gambar antri untuk gambar yang ditampilkan segera setelah Tab # 4 diaktifkan, dan kemudian pengguna dengan cepat beralih ke Tab # 3 dan kemudian kembali ke Tab # 4 ... ini kemudian akan memasukkan kembali perubahan lain selama 10 detik sementara antrian lama masih diputar, mungkin sekitar 2 atau 3 detik ke antrian jika dialihkan cukup cepat ... tetapi bahkan tiba di 5 detik ke arus adalah masalah.

jadi saya membutuhkan beberapa cara untuk membatalkan tumpukan perubahan lama sebelum meletakkan tumpukan baru ...

Saya menulis kueri ini di masa lampau karena saya sudah menemukan solusi alternatif untuk masalah ini dengan menambahkan filter peristiwa mata elang pada fungsi pemutaran. Namun saya masih penasaran apakah pembatalan acara dapat dilakukan, karena menurut saya pengetahuan tersebut akan berguna di masa mendatang. terima kasih atas bantuan yang diberikan :)

eerok512
sumber
bagaimana Anda bisa menggunakan filter acara mata elang pada fungsi pemutaran?
Maniganda saravanan

Jawaban:

241
[NSObject cancelPreviousPerformRequestsWithTarget:]

atau

[NSObject cancelPreviousPerformRequestsWithTarget:selector:object:]

Ini targetadalah objek asli yang performSelector:afterDelay:dipanggil.

Sebagai contoh:

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

Lihat dokumen apple , ini tepat di akhir performSelector:withObject:afterDelay:deskripsi.

StefanB
sumber
33
Untuk beberapa penjelasan tentang penggunaannya, coba ini: [NSObject cancelPreviousPerformRequestsWithTarget: self];
dnstevenson
[NSObject cancelPreviousPerformRequestsWithTarget: self selector: @selector (mySel :) object: nil];
webtrick101
2

Untuk membatalkan semua permintaan perform sebelumnya, Anda dapat menggunakan:

[NSObject cancelPreviousPerformRequestsWithTarget:self];   
Marco Mirisola
sumber
2

Jika Anda mencari "performSelector" yang cocok dengan " cancelPreviousPerformSelector" ... ternyata tidak. (Ugh, Apple, kenapa kamu melakukan itu padaku ???)

Metode, er, ah, "mencocokkan" adalah:

performSelector

cancelPreviousPerformRequestsWithTarget

(Hanya untuk membuatnya lebih sulit untuk diingat, tanpa menelusuri dokumen.)

Irene
sumber
1

Periksa dokumen NSRunLoop. Kamu ingin-cancelPerformSelectorsWithTarget:

NSResponder
sumber