2012-06-15 22 views
28

Tôi đã tạo một ứng dụng thử nghiệm với bộ hẹn giờ trước khi triển khai nó trong dự án của tôi. Đây là lần đầu tiên tôi sử dụng bộ hẹn giờ. Nhưng vấn đề là khi tôi thực hiện hẹn giờ bằng cách sử dụng [NSTimer timerWithTimeInterval: target: selector: userInfo: repeats: ];, nó không hoạt động. Đây là mã của tôi, Interface:NSTimer timerWithTimeInterval: không hoạt động

@interface uialertViewController : UIViewController 
{ 

    NSTimer *timer; 
} 

-(void)displayAlert; 
-(void)hideandview; 
@end 

Thực hiện:

@implementation uialertViewController 
- (void)viewDidLoad { 

    [self displayAlert]; 
    [super viewDidLoad]; 
} 


-(void)displayAlert{ 

    timer = [NSTimer timerWithTimeInterval:1 target:self selector:@selector(hideandview) userInfo:nil repeats:NO]; 

    alert = [[UIAlertView alloc] initWithTitle:@"testing" message:@"hi hi hi" delegate:nil cancelButtonTitle:@"continue" otherButtonTitles:nil]; 
    [alert show]; 




    [alert release]; 
    alert = nil; 

} 

-(void)hideandview{ 

    NSLog(@"triggered"); 

    [alert dismissWithClickedButtonIndex:0 animated:YES]; 

    [alert release]; 

    [self displayAlert]; 
} 

@end 

Sau đó, tôi đã thay đổi[NSTimer timerWithTimeInterval: target: selector: userInfo: repeats: ];với[NSTimer scheduledTimerWithTimeInterval: target: selector:userInfo: repeats: ];, Nó đang làm việc. Vấn đề với timerWithTimeInterval: là gì? Tôi có đang làm gì trong lần triển khai đầu tiên của mình không? Cảm ơn trước.

+0

timerWithTimeInterval tạo bộ hẹn giờ nhưng không khởi động và lập lịch biểu .... Tôi nghĩ rằng đó là sự khác biệt duy nhất – rooster117

+0

@ rooster117: sau đó tôi cần phải gọi phương pháp lửa timers, am i chính xác? –

+0

Có hoặc chỉ cần gọi scheduleTimerWithTimeInterval khi bạn muốn khởi động nó. Dù bằng cách nào, – rooster117

Trả lời

115

scheduledTimerWithTimeInterval:invocation:repeats:scheduledTimerWithTimeInterval:target:selector:userInfo:repeats: tạo tính giờ mà có được tự động thêm vào một NSRunLoop, có nghĩa là bạn không cần phải thêm chúng mình. Việc thêm chúng vào NSRunLoop là nguyên nhân khiến chúng phát sinh.

Với timerWithTimeInterval:invocation:repeats:timerWithTimeInterval:target:selector:userInfo:repeats:, bạn phải thêm bộ đếm thời gian để một vòng lặp chạy bằng tay, với mã như thế này:

[[NSRunLoop mainRunLoop] addTimer:repeatingTimer forMode:NSDefaultRunLoopMode]; 

câu trả lời khác trên đây gợi ý rằng bạn cần phải gọi fire mình. Bạn không - nó sẽ được gọi ngay khi bộ hẹn giờ được đặt trên một vòng lặp chạy.

+0

Giải thích tuyệt vời! Cảm ơn! – kev

+2

Ngay cả với phương pháp đã lên lịch, nếu chạy trong dòng lệnh util, bạn vẫn cần phải thêm nó vào mainRunLoop bằng tay, ít nhất là theo kinh nghiệm của tôi, cũng như được biểu thị bằng: [run run run nsrunloop] (http: // hackazach.net/code/2013/08/09/run-run-run-nsrunloop/) – jheld

+0

scheduleTimer đã làm việc hoàn hảo với đề xuất này mà không phải kích hoạt hẹn giờ. cảm ơn bạn – hitme

1

Sự khác biệt giữa hai phương pháp là phương pháp timerWithTimeInterval trả về đối tượng NSTimer chưa được kích hoạt. Để kích hoạt bộ hẹn giờ, bạn phải sử dụng [timer fire]; Mặt khác, scheduledTimerWithTimeInterval trả lại số NSTimer đã bị hủy.

Vì vậy, trong việc thực hiện đầu tiên của bạn, bạn được chỉ thiếu [timer fire];

+4

Xem bài đăng của tôi - '[timer fire]' không "bắt đầu" bộ hẹn giờ, nó chỉ đơn giản gọi trực tiếp phương thức đó. Bạn cần thêm bộ hẹn giờ vào vòng lặp chạy để nó bắt đầu. –

+1

Wow, tôi đã không nhận thức được điều đó, OP nên chấp nhận câu trả lời của bạn. –

+0

Nó hoạt động một lần nhưng đối với quá trình liên tục sử dụng mã @Joseph Humfrey. – yazh

2

Cũng có thể muốn đảm bảo thêm bộ hẹn giờ trên chuỗi chính.

assert(Thread.isMainThread) 
let timer = Timer.scheduledTimer(timeInterval: 3, target: self, selector: #selector(YourSelector), userInfo: nil, repeats: true)