我有一个程序,从网上下载吨文件如何确保某些代码每隔1秒不会超过1次?
我有几个线程下载数据。
每个数据被调用后,我需要更新管理对象上下文
如果10个线程完成加载大约在同一时间,然后被管理对象上下文将获得运行10次。
事实是我只需要运行一次。
我想要做的是创建一个接受块的方法。
我该如何做一个接收块的函数,但是如果该块已经运行不到1秒钟,它将不会运行该块,而是会推迟第二次运行,直到1秒,无论如何通常这个函数被调用。
我有一个程序,从网上下载吨文件如何确保某些代码每隔1秒不会超过1次?
我有几个线程下载数据。
每个数据被调用后,我需要更新管理对象上下文
如果10个线程完成加载大约在同一时间,然后被管理对象上下文将获得运行10次。
事实是我只需要运行一次。
我想要做的是创建一个接受块的方法。
我该如何做一个接收块的函数,但是如果该块已经运行不到1秒钟,它将不会运行该块,而是会推迟第二次运行,直到1秒,无论如何通常这个函数被调用。
Mike Ash已经为此执行了timer class。
你需要用行为类型来初始化它,取决于具体的行为,你想:
MABGTimerDelay
意味着每次调用afterDelay:1.0 do:^{ /*code*/ }
以便它只被运行完整它将集火追溯到时间第二次在末尾打电话。MABGTimerCoalesce
意味着每当您拨打afterDelay:1.0 do:^{ /*code*/ }
时,它都会设置启用日期,以便在第一次呼叫后仅运行整整一秒。如果它已经运行,这两种行为都将允许您再次运行它,但只有在延迟再次通过后。
如果运行的程序块总是相同的,那么可以让循环运行一秒钟的时间间隔来检查布尔值,并且只在布尔值为YES时才执行该程序段。事情是这样的:
BOOL needsUpdate;
-(void) loop {
if (needsUpdate) {
//Run Block
needsUpdate = NO;
}
[self performSelector:@selector(loop) withObject:nil afterDelay:1.0];
}
当线程完成加载,您只需设置needsUpdate = YES
和环路采用其余的工作。
当一个线程完成调用主线程中的方法。在该方法中,制作一个延迟1秒的定时器。
- (void)threadDidFinish
{
if (_saveTimer != nil)
{
_saveTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(saveTimerDidFire) userInfo:nil repeats:NO];
}
}
- (void)saveTimerDidFire
{
[_saveTimer invalidate];
_saveTimer = nil;
// save the changes
}
此代码将确保您无论次数调用threadDidFinish的次数都能保存每秒。 NSTimer * _saveTimer是一个实例变量。