8

.h ファイルに次のコードがあります。

#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h>
#import <AVFoundation/AVFoundation.h>
#import <MapKit/MapKit.h>

@interface LandingController : UIViewController<CLLocationManagerDelegate> {
    CLLocationManager *LocationManager;
    AVAudioPlayer *audioPlayer;

}

@property (nonatomic, retain) NSTimer *messageTimer;

- (IBAction)LoginButton:(id)sender;

@end

.m ファイルに次のコードがあります。

@interface LandingController ()

@end

@implementation LandingController
@synthesize messageTimer;

- (void)checkForMessages
{

    UIAlertView *alert = [[UIAlertView alloc]
                          initWithTitle:@"BINGO:"
                          message:@"Bingo This Works"
                          delegate:nil
                          cancelButtonTitle:@"Okay"
                          otherButtonTitles:nil];

    [alert show];

}

- (IBAction)LoginButton:(id)sender {

    if ([UserType isEqualToString:@"Owner"]) {

        if (messageTimer){ 
        [self.messageTimer invalidate];
        self.messageTimer = nil;
        }

    } else {

        if (!messageTimer){

           self.messageTimer = [NSTimer scheduledTimerWithTimeInterval:10.0
                                                             target:self
                                    selector:@selector(checkForMessages)
                                                           userInfo:nil
                                                            repeats:YES];


        }
    }

}

@end

しかし、無効化を呼び出したときにタイマーが停止したくありません。

LoginButton は 2 回だけ押されます。1 回は strResult が「Guard」に = であり、アプリケーションがそれを「所有者」に等しくなるように変更し、ユーザーが再度ログイン ボタンを押すため、複数を設定しているとは思えません。タイマー。

ログインボタンを押してタイマーを開始した後、別のビューにセグエしてから、セグエバックしてもう一度ログインボタンを押します。これは、タイマーを停止したいときです。しばらくビューを切り替えてから戻ってきたので、messageTimer を取得するために何か特別なことをする必要がありますか?

何か案は?

ありがとう!

4

7 に答える 7

35

[self.messageTimer invalidate]タイマーを作成したのと同じスレッドで呼び出す必要があります。メインスレッドでタイマーが作成され、無効化されていることを確認してください。

dispatch_async(dispatch_get_main_queue(), ^{
    if ([UserType isEqualToString:@"Owner"]) {
        [self.messageTimer invalidate];
        self.messageTimer = nil;
    } else {
        self.messageTimer = [NSTimer scheduledTimerWithTimeInterval:10.0
                                                             target:self
                                                           selector:@selector(checkForMessages)
                                                           userInfo:nil
                                                            repeats:YES];
    }
});
于 2013-05-10T08:16:35.947 に答える
17

NSTimer は NSRunLoop によって保持されるため、実際に複数のタイマーを作成し、参照しているものだけを無効にしている場合に、問題が発生する唯一の方法です。

例:

if(!timer)
        timer = [NSTimer scheduledTimerWithTimeInterval:1 target:(self) selector:@selector(processTimer) userInfo:nil repeats:YES];
于 2013-05-10T05:31:08.667 に答える
3

繰り返しをいいえにしてみましたか

self.messageTimer = [NSTimer scheduledTimerWithTimeInterval:10.0
                                                             target:self
                                                          selector:@selector(checkForMessages)
                                                           userInfo:nil
                                                            repeats:NO];
于 2013-05-10T05:40:54.360 に答える
1

メソッドに を入れてNSLogみませんか?checkForMessages本当にタイマーが 1 つしかないかどうかを確認する方が簡単です。

(これはコメントに入れたいのですが、あまり評判がありません....)

于 2013-05-10T07:58:02.817 に答える
0

その奇妙だが無効化されたタイマー参照が渡され、タイマー参照が作成されました。

    delayTimer = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(updateDelayLable:) userInfo:nil repeats:YES];

    -(void)updateSendDataDelayLable:(NSTimer*)timer{
delayValueForGNSS--;

                if (delayValueForGNSSSend==0) {
                     [timer invalidate];
                     timer = nil;
                     [delayTimer invalidate];
                     delayTimer = nil;
                }
            }
于 2019-07-08T21:20:25.753 に答える