2011-09-15 29 views
1

我有一个程序,从网上下载吨文件如何确保某些代码每隔1秒不会超过1次?

我有几个线程下载数据。

每个数据被调用后,我需要更新管理对象上下文

如果10个线程完成加载大约在同一时间,然后被管理对象上下文将获得运行10次。

事实是我只需要运行一次。

我想要做的是创建一个接受块的方法。

我该如何做一个接收块的函数,但是如果该块已经运行不到1秒钟,它将不会运行该块,而是会推迟第二次运行,直到1秒,无论如何通常这个函数被调用。

回答

2

Mike Ash已经为此执行了timer class

你需要用行为类型来初始化它,取决于具体的行为,你想:

  • MABGTimerDelay意味着每次调用afterDelay:1.0 do:^{ /*code*/ }以便它只被运行完整它将集火追溯到时间第二次在末尾打电话。
  • MABGTimerCoalesce意味着每当您拨打afterDelay:1.0 do:^{ /*code*/ }时,它都会设置启用日期,以便在第一次呼叫后仅运行整整一秒。

如果它已经运行,这两种行为都将允许您再次运行它,但只有在延迟再次通过后。

1

如果运行的程序块总是相同的,那么可以让循环运行一秒钟的时间间隔来检查布尔值,并且只在布尔值为YES时才执行该程序段。事情是这样的:

BOOL needsUpdate; 
    -(void) loop { 
    if (needsUpdate) { 
     //Run Block 
     needsUpdate = NO; 
    } 
    [self performSelector:@selector(loop) withObject:nil afterDelay:1.0]; 
    } 

当线程完成加载,您只需设置needsUpdate = YES和环路采用其余的工作。

1

当一个线程完成调用主线程中的方法。在该方法中,制作一个延迟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是一个实例变量。

相关问题