我有一个发送错误消息的函数(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。
如何取消之前的调度并编写新的调度(覆盖)。
答案 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
基本上,你没有取消调度的任务(因为你不能),但如果它已经过时,你就不会做任何事情。