objective-c - 如何在 Cocoa 中运行 NSTimer 直到标志变量 ON

标签 objective-c macos cocoa nstimer

我有一个问题:我想 NSTimer 等待,直到 FLAG 变量为 YES,如果 FLAG = YES,myTimer 停止。我怎样才能做到这一点?我尝试了下面的代码:

NSTimer *myTimer;
int delay = 6.0;
scanTimer= [NSTimer scheduledTimerWithTimeInterval:6.0 target:self selector:@selector(anotherfunc) userInfo:nil repeats:YES];
myTimer= [NSTimer timerWithTimeInterval: delay
                                         target:self
                                       selector: @selector(resetAll:) userInfo:nil
                                        repeats:NO];
        [[NSRunLoop currentRunLoop] addTimer:myTimer forMode:NSModalPanelRunLoopMode];
        [[NSApplication sharedApplication] runModalForWindow: scanningPanel];

这是resetAll()函数:

-(void) resetAll: (NSTimer *) theTimer
{
    if(FLAG)
    {
        NSLog(@"killWindow");
        [[NSApplication sharedApplication] abortModal];
        [scanningPanel orderOut: nil];
        FLAG = NO;
    }
    else
    {
        delay +=6.0;
        myTimer= [NSTimer timerWithTimeInterval: delay
                                         target:self
                                       selector: @selector(resetAll:) userInfo:nil
                                        repeats:NO];
        [[NSRunLoop currentRunLoop] addTimer:myTimer forMode:NSModalPanelRunLoopMode];
        [[NSApplication sharedApplication] runModalForWindow: scanningPanel];
    }

}

我使用了2个NSTimer,但只有myTimer运行,scanTimer没有运行。请给我任何建议。提前致谢

最佳答案

为什么不使用键值观察来更改 FLAG?添加标志变量作为您正在使用的类的属性:

@property(nonatomic, assign) BOOL flag;

为了避免在 .m 中重复放置:

#define kFooFlagKey @"flag"

覆盖 -setFlag:因此它符合 KVO:

-(void)setFlag:(BOOL)flag
{
    if (_flag == flag) {
        return;
    }
    [self willChangeValueForKey:kFooFlagKey];
    _flag = flag;
    [self didChangeValueForKey:kFooFlagKey];
}

在类的初始化程序中,将 self 添加为您要监视的键路径的观察者。在本例中,它将用于属性“flag”。

[self addObserver:self
   forKeyPath:kFooFlagKey
      options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld
      context:NULL];

不要忘记删除类中的观察者'-dealloc:

[self removeObserver:self forKeyPath:kFooFlagKey];

创建计时器以重复触发(firingCallBack 是每次触发时调用的方法):

    NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:0.0f
                                                  target:self
                                                selector:@selector(firingCallBack)
                                                userInfo:nil
                                                 repeats:YES];

实现KVO观测方法:

-(void)observeValueForKeyPath:(NSString *)keyPath
                 ofObject:(id)object
                   change:(NSDictionary *)change
                  context:(void *)context
{
    if ([keyPath isEqualToString:kFooFlagKey]) {
        if (self.flag) {
           [self performSelector:@selector(resetAll) withObject:nil afterDelay:0.0f];
        }
    }
}

按照您的意愿实现 -resetAll。当您通过访问器设置标志变量并且标志设置为 YES 时,它将被调用

关于objective-c - 如何在 Cocoa 中运行 NSTimer 直到标志变量 ON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18605070/

相关文章:

objective-c - 如何使用 NSDateFormater 从 NSString 转换为 NSDate

ios - 在 UINavigationController 中设置框架 View Controller View

xcode - 我的 Mac OS X Cocoa 文档在哪里?

iphone - 如何重构一个核心数据模型,使两个现有实体继承一个新的抽象实体

ios - 显示大图像文件时在 viewDidAppear 之后调用 DidRecieveMemoryWarning

c++ - 是否可以从 Objective-C 获得中间 C 代码?

c++ - Eclipse CDT 无法在 Mac 上使用 gdb 进行调试

macos - OSX 启动 : Reliable means of monitoring wired connection?

objective-c - 在 Objective-C 中编写 CalDAV 客户端库的最佳方法?

iphone - NSString 比较特殊字符无关