gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 17:30:17 27 4
gpt4 key购买 nike

我有一个问题:我想 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com