2012-02-19 18 views
5

Đối với cuộc sống của tôi, tôi không thể tìm ra lý do tại sao NSTimer này không cháy. đây là tất cả mã có vẻ liên quan (ít nhất là với tôi)NSTimer không bắn

- (IBAction)connectClick:(id)sender 
{ 
    if (connected) 
    { 
     NSLog(@"Disconnecting"); 
     [timer invalidate]; 
     timer = nil; 
     connected = NO; 
     [Connect setStringValue:@"Connect"]; 
     NSLog(@"Finished\n"); 
    } 
    else 
    { 
     NSLog(@"Connecting"); 
     timer = [NSTimer timerWithTimeInterval:2.0 target:self selector:@selector(timerFireMethod:) userInfo:nil repeats:YES]; 
     //[timer fire]; tested this line. same results 
     [Connect setStringValue:@"a"]; 
     connected = YES; 
     NSLog(@"Finished\n"); 
    } 
} 

- (void)timerFireMethod:(NSTimer*)theTimer 
{ 
    NSLog(@"Fireing event"); 
    //[self resetRequest]; 
    //[spinner startAnimation:nil]; 
    //[request startAsynchronous]; 
} 

Tôi đã đọc tài liệu về táo và các câu hỏi khác, nhưng tôi không thể hiểu được. Nó thậm chí không gọi timerDireMethod: một lần. Tôi đã nghe nói điều này có thể được gây ra bởi các chủ đề khác nhau, nhưng theo như tôi có thể nói, tôi không sử dụng nhiều chủ đề.

Tất cả ý tưởng đều được chào đón.

+0

thể trùng lặp của [NSTimer không bắn] (http://stackoverflow.com/questions/6752234/nstimer-not-firing) – Caleb

+0

Có một số lý do mà bạn đang sử dụng NSEventTrackingRunLoopMode thay vì NSDefaultRunLoopMode? – Caleb

+0

Xin lỗi đã đến muộn. Tôi chỉ nhận ra điều đó và sẽ thêm nó vào câu hỏi. nhưng có NSDefaultRunLoopMode làm việc. Xin lỗi vì đã làm bạn bối rối. –

Trả lời

9

Từ NSTimer documentation dành cho Mac OS X:

Bạn phải thêm bộ đếm thời gian mới cho một vòng lặp chạy, sử dụng addTimer: forMode :. Sau đó, sau vài giây trôi qua, bộ đếm thời gian sẽ kích hoạt, gửi thông báo aSelector để nhắm mục tiêu. (Nếu bộ đếm thời gian được cấu hình để lặp lại, không có nhu cầu để sau đó lại thêm bộ đếm thời gian để vòng lặp chạy.)

Cá nhân, tôi thường sử dụng +[NSTimer scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:]

Cũng lưu ý rằng nếu bạn gọi này phương pháp trên một chủ đề nền, hoặc trong một hoạt động khối chạy trong một hàng đợi nền, các NSTimer bị phá hủy khi các chủ đề nền không. Vì vậy, hãy chắc chắn rằng bạn đang chạy nó trên các chủ đề chính hoặc trong hàng đợi chính nếu thích hợp cho tình hình của bạn.

+1

+1 Tâm trí tuyệt vời nghĩ như nhau. ;-) – Caleb

+0

Ha, làm việc theo nhóm tốt đẹp! – bneely

+0

Tôi đã sử dụng nhưng nó vẫn không kích hoạt. – shim

1

Đọc tài liệu cho các phương pháp mà bạn đang sử dụng, +timerWithTimeInterval:target:selector:userInfo:repeats::

Bạn phải thêm bộ đếm thời gian mới cho một vòng lặp chạy, sử dụng addTimer: forMode :. Sau đó, sau vài giây trôi qua, bộ đếm thời gian sẽ kích hoạt, gửi thông báo aSelector để nhắm mục tiêu.

+1

+1 Tâm trí tuyệt vời nghĩ như nhau. ;-) – bneely