iOS - รันโค้ดส่วนหนึ่งเป็นเวลา 10 วินาที

ฉันต้องการรันโค้ดทุกๆ 500 มิลลิวินาทีเป็นเวลาทั้งหมด 10 วินาที ฉันมีรหัสที่ทำงานทุกครึ่งวินาทีด้วยรหัสนี้

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

แต่ดูเหมือนฉันไม่สามารถหาวิธีหยุดการทำงานหลังจากผ่านไป 10 วินาทีได้ อาร์กิวเมนต์ "ซ้ำ" ดูเหมือนจะไม่อนุญาตให้มีเวลาที่ระบุ ใครช่วยชี้ให้ฉันเห็นว่าฉันควรจะไปทางไหน?

ขอบคุณไบรอัน


person Brian Boyle    schedule 13.07.2012    source แหล่งที่มา
comment
คำตอบนี้จะมีผลหรือไม่   -  person thegrinner    schedule 13.07.2012


คำตอบ (4)


คุณต้องส่งข้อความ invalidate บน NSTimer ที่ scheduleTimerWithTimeInterval:target:selector:userInfo:repeas: ให้คุณ ตัวอย่างเช่น กำหนด NSTimer ให้เมธอดนั้นส่งคืนคุณในคุณสมบัติหรือ iVar ของคลาสของคุณและหลังจากผ่านไป 10 วินาทีให้เรียก invalidate

ตัวอย่าง:

.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];
}
[...]

คุณสามารถหลีกเลี่ยง NSTimer อีกได้หากต้องการโดยการใช้แฟล็ก finish และติดตามว่าคุณส่งข้อความเมธอด getLevel กี่ครั้ง เนื่องจากทุกๆ .5 วินาที ซึ่งจะเป็น 20 ครั้ง

แต่ฉันอยากได้วัตถุ 2 NSTimer วัตถุมากกว่าเพราะคุณรู้ว่ามันคือ 10 วินาทีโดยไม่คำนึงถึงตัวจับเวลาอื่น ซึ่งคุณอาจตัดสินใจเปลี่ยนขึ้นหรือลงความถี่...

person Daniel    schedule 13.07.2012

อีกวิธีหนึ่งที่คุณสามารถทำได้คือกำหนดตัวเลือก เช่น -(void)stopTimer{} ซึ่งทำให้ตัวจับเวลาเป็นโมฆะ จากนั้นเมื่อคุณสร้างตัวจับเวลาตั้งแต่แรก ให้ทำอย่างใดอย่างหนึ่งต่อไปนี้:

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

person jacerate    schedule 13.07.2012

สิ่งที่ดีที่สุดที่ต้องทำคือสร้างทรัพย์สินในชั้นเรียนของคุณ

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

จากนั้นในตัวเลือก getLevel ของคุณให้เรียกสิ่งนี้:

if (ticks >= 20) [self.timer invalidate];
// 20 is 10 seconds * 500 milliseconds
ticks++;
person Matt Hudson    schedule 13.07.2012
comment
มีเพียง 20,500ms ใน 10 วินาที ไม่ใช่ 5,000 และคำสั่ง if ควรเป็น if (ทำเครื่องหมาย == 20) ไม่ใช่ ›20 - person Kaan Dedeoglu; 13.07.2012

คุณสามารถตั้งเวลาอื่นเพื่อหยุดการทำงานโดยใช้วันที่ไม่ถูกต้องได้ เพียงเก็บการอ้างอิงสำหรับตัวจับเวลานี้ไว้ใน ivar หรือคุณสมบัติ

ดูคำตอบนี้เพื่อดูข้อมูลเพิ่มเติม

person Selkie    schedule 13.07.2012