我是Objective C的新手。我正在使用
安排一个线程进入睡眠状态[NSThread sleepForTimeInterval:10.0f];
但是当特定事件发生时我想唤醒这个睡眠线程。我如何唤醒这个沉睡的线程?
由于
答案 0 :(得分:1)
这无法完成。如果线程使用该方法休眠,则在时间结束之前无法唤醒。
可以使用NSCondition
对象模拟这样的事情。
答案 1 :(得分:0)
我建议使用NSTimer
而不是使用NSThread,这主要是由于睡眠线程的执行控制的限制。 NSTimer
允许通过调用invalidate
立即取消,可以响应某些用户取消来调用该NSTimer
。 NSTimer
提供两种类型的触发:重复和非重复。下面的代码使用//delayInSeconds and intervalInSeconds are NSTimeInterval values calclulated elsewhere
NSDate *fireDate = [[NSDate date] dateByAddingTimeInterval:delayInSeconds];
//Create a timer that will repeat, starting with the fireDate
//Optionally, userInfo could contain an object. checkSomething:
// would take one parameter, the NSTimer which would carry the userInfo
//timer is a strong property defined for a particular class, as an instance variable.
self.timer = [[NSTimer alloc] initWithFireDate:fireDate
interval:intervalInSeconds
target:self
selector:@selector(checkSomething:)
userInfo:nil
repeats:TRUE];
//Launch the timer on the main run loop
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
来重复调用指定的选择器:
sleepForTimeInterval
睡眠NSThread的限制
睡眠线程的一个明显缺点是唤醒它是一种非传统的解决方案(涉及使用信号来杀死进程),剩下的唯一选择之一是使用标志。这是一个问题,因为显着的睡眠时间会有延迟。例如,如果睡眠时间是10秒,那么在读取标志之前可能会有多达10秒的延迟,并且应用程序会响应。由于cancel
是一个类方法,因此无法在休眠线程上调用 $.scrollTo($(".mySelector'), 800,{queue:true,offset:{top:-100,left:-1000},margin:true});
。