2010-11-11 32 views
18

Tôi có đoạn mã sau:Làm cách nào để thay đổi thời gian cho NSTimer?

timer = [[NSTimer scheduledTimerWithTimeInterval:0.50 target:self selector:@selector(onTimer) userInfo:nil repeats:YES] retain];  

-(void) onTimer 
{ 
} 

Sau mỗi 0.50 giây phương pháp OnTimer được gọi.

Nhưng bây giờ tôi muốn tăng khoảng thời gian.

Điều đó có nghĩa:

OnTimer calls after 0.55 
OnTimer calls after 0.60 
OnTimer calls after 0.65 
OnTimer calls after 0.70 
OnTimer calls after 0.75 
& so on. 

Có giải pháp nào cho điều này ?? Tôi đã thử rất nhiều nhưng nó không hoạt động.

Trả lời

21

Chắc chắn bạn có thể thực hiện việc này. Thay đổi repeats:YES thành repeats:NO để bộ hẹn giờ không lặp lại và sau đó trong onTimer, chỉ cần bắt đầu bộ hẹn giờ mới với khoảng thời gian dài hơn. Bạn cần một biến để giữ khoảng thời gian của bạn để bạn có thể làm cho nó lâu hơn một chút mỗi lần thông qua onTimer. Ngoài ra, bạn có thể không cần phải giữ lại bộ đếm thời gian nữa, vì nó sẽ chỉ kích hoạt một lần, và khi đó, bạn sẽ nhận được một bộ đếm thời gian mới.

Tôi không phải chuyên gia Objective-C (hoặc chuyên gia iOS ...) và nó được một lúc nhưng tôi nghĩ rằng một cái gì đó như thế này:

float gap = 0.50; 

[NSTimer scheduledTimerWithTimeInterval:gap target:self selector:@selector(onTimer) userInfo:nil repeats:NO]; 

-(void) onTimer { 
    gap = gap + .05; 
    [NSTimer scheduledTimerWithTimeInterval:gap target:self selector:@selector(onTimer) userInfo:nil repeats:NO]; 
} 

Something như vậy? Oh, và tôi thực sự không quá chắc chắn về ngữ nghĩa retain ở đây ... đọc các tài liệu để chắc chắn rằng bạn không bị rò rỉ!

+0

Cảm ơn, hiện tại nó hoạt động tốt. –

+0

Đối tượng NSTimer sẽ được tự động dealloced khi bộ đếm thời gian kết thúc. – qwertz

4

Bạn có thể thử điều chỉnh FireDate của bộ hẹn giờ, xem setFireDate

6

Dưới đây là một giải pháp cho câu hỏi Hardik bằng cách sử dụng tài sản fireDate NSTimer của (viết bằng Swift):

var timeInterval = 0.50 
NSTimer.scheduledTimerWithTimeInterval(timeInterval, target: self, selector: Selector("onTimer:"), userInfo: nil, repeats: true) 

func onTimer(timer: NSTimer) { 
    timeInterval += 0.05 
    timer.fireDate = timer.fireDate.dateByAddingTimeInterval(timeInterval) 
} 
+0

bạn không thể _re-fire_ một bộ hẹn giờ như thế này. – holex

+0

cho tôi nó hoạt động. Đây là mã: https://gist.github.com/anonymous/86005ed7049e985a34f6 Và btw. bộ đếm thời gian đã lặp lại đúng và tôi chỉ đang thiết lập ngày bắn tiếp theo. –

+1

Theo như tôi đọc tài liệu cho NSTimer sử dụng setFireDate là hoàn toàn tốt (https://developer.apple.com/library/ios/documentation/cocoa/reference/foundation/classes/NSTimer_Class/Reference/NSTimer.html#// apple_ref/occ/instm/NSTimer/setFireDate :). –

1

Bạn không thể thay đổi khoảng thời gian mà một bộ đếm thời gian cháy. Không đời nào. Không có API để thực hiện việc này.

Hai cách giải quyết rõ ràng: Nếu bạn luôn luôn thay đổi khoảng thời gian, thì bạn chỉ có thể thay đổi thời gian tiếp theo mà bộ hẹn giờ kích hoạt; điều này có ưu tiên hơn khoảng thời gian hẹn giờ. Tất nhiên bạn phải làm điều đó mỗi khi bộ đếm thời gian kích hoạt. Nếu bạn đôi khi thay đổi khoảng thời gian, chỉ cần vô hiệu hóa bộ hẹn giờ đầu tiên và tạo bộ tính giờ mới với khoảng thời gian mới.

0

Điều này chỉ hoạt động như sự quyến rũ đối với tôi.

- (void)FlexibleTimer { 
    if (!keyTimer) { 
     keyTimer = [NSTimer scheduledTimerWithTimeInterval:self.intervalOfIdleTimer 
                 target:self 
                selector:@selector(keyTimerExceeded) 
                userInfo:nil 
                repeats:YES]; 
    } 
    else { 
     if (fabs([keyTimer.fireDate timeIntervalSinceNow]) < self.intervalOfIdleTimer - 1.0) { 
      [keyTimer setFireDate:[NSDate dateWithTimeIntervalSinceNow:self.intervalOfIdleTimer]]; 
     } 
    } 
} 

- (void)keyTimerExceeded { 
    [self setNextDelayForFlexibleTimer]; 
    [self FlexibleTimer]; 
    NSLog(@"Timer Exceeded %f", [[NSDate date] timeIntervalSince1970]); 
} 
Các vấn đề liên quan