覆盖调度命令

时间:2017-02-01 22:16:40

标签: objective-c macos cocoa event-dispatch-thread

我有一个发送错误消息的函数(import org.apache.hadoop.fs._; val fs = FileSystem.get(sc.hadoopConfiguration()); fs.rename(new Path("csvDirectory/data.csv/part-0000"), new Path("csvDirectory/newData.csv")); )。然后在5秒后将其删除:

sendError

问题是,如果按钮运行一次,然后在第二次运行3秒后再次运行,则消息将在2秒后删除而不是5。

如何取消之前的调度并编写新的调度(覆盖)。

1 个答案:

答案 0 :(得分:4)

有几种方法可以做到这一点。首先,您可以停止使用GCD并返回到更早的机制-performSelector:withObject:afterDelay:。这里的优点是有一个方法+cancelPreviousPerformRequestsWithTarget:selector:object:来取消仍然挂起的执行请求。

-(void)sendError:(NSString*)message{
    _errorMessage.stringValue = message;
    [NSObject cancelPreviousPerformRequestsWithTarget:_errorMessage selector:@selector(setStringValue:) object:@""];
    [_errorMessage performSelector:@selector(setStringValue:) withObject:@"" afterDelay:5];
}

如果您想继续使用GCD,则需要自行跟踪取消。一种方法是保持“一代”计数。因此,假设存在一个名为NSUInteger的{​​{1}}实例变量。

_errorGeneration

基本上,你没有取消调度的任务(因为你不能),但如果它已经过时,你就不会做任何事情。