iOS - Jalankan Sepotong Kode selama 10 Detik

Saya ingin mengeksekusi sepotong kode setiap 500 ms selama total 10 detik. Saya memiliki kode yang berfungsi dijalankan setiap setengah detik dengan kode ini

[NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(getLevel:) userInfo:nil repeats: YES];

tapi sepertinya saya tidak tahu cara menghentikannya berjalan setelah 10 detik. Argumen "berulang" sepertinya tidak mengizinkan waktu tertentu. Bisakah seseorang mengarahkan saya ke arah mana saya harus pergi dengan ini?

Terima kasih Brian


person Brian Boyle    schedule 13.07.2012    source sumber
comment
Apakah jawaban ini berlaku?   -  person thegrinner    schedule 13.07.2012


Jawaban (4)


Anda perlu mengirim pesan invalidate pada NSTimer yang diberikan scheduleTimerWithTimeInterval:target:selector:userInfo:repeats: kepada Anda. Misalnya, tetapkan NSTimer yang dikembalikan metode tersebut kepada Anda di properti atau iVar kelas Anda dan setelah 10 detik panggil invalidate di atasnya.

Contoh:

.h:

@interface myClass{
NSTimer *myT;
}
[...]

.m:

[...]
{
    myT = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(getLevel:) userInfo:nil repeats: YES];

    [NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(stop) userInfo:nil repeats:NO];
}

-(void)stop{
    [myT invalidate];
}
[...]

Anda dapat menghindari NSTimer lainnya jika Anda mau dengan menerapkan semacam tanda finish dan melacak berapa kali Anda mengirim pesan dengan metode getLevel, karena setiap 0,5 detik, itu berarti 20 kali.

Tapi saya lebih suka 2 NSTimer objek karena Anda tahu itu 10 detik terlepas dari pengatur waktu lainnya, yang mungkin Anda putuskan untuk diubah, menaikkan atau menurunkan frekuensinya...

person Daniel    schedule 13.07.2012

Cara lain yang dapat Anda lakukan adalah dengan menentukan pemilih, misalnya -(void)stopTimer{} yang membuat pengatur waktu tidak valid. Kemudian saat Anda membuat Timer, lakukan salah satu hal berikut:

[self performSelector:@selector(stopTimer) withObject:nil afterDelay:10.0];

person jacerate    schedule 13.07.2012

Hal terbaik untuk dilakukan adalah membuat properti di kelas Anda.

@property (nonatomic, strong) NSTimer *timer;
@property (nonatomic, strong) int ticks;

lalu di pemilih getLevel Anda, panggil ini:

if (ticks >= 20) [self.timer invalidate];
// 20 is 10 seconds * 500 milliseconds
ticks++;
person Matt Hudson    schedule 13.07.2012
comment
Hanya ada 20 500ms dalam 10 detik, bukan 5000 dan pernyataan if seharusnya if (centang == 20) bukan ›20. - person Kaan Dedeoglu; 13.07.2012

Anda dapat mengatur timer lain untuk menghentikannya menggunakan invalidate. Simpan saja referensi untuk pengatur waktu ini di ivar atau properti.

Periksa jawaban ini untuk informasi lebih lanjut.

person Selkie    schedule 13.07.2012