如何确保某些代码每1秒运行不超过1?

时间:2011-09-15 05:20:08

标签: objective-c xcode nsmanagedobjectcontext

我有一个从网上下载大量文件的程序

我有几个线程下载数据。

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

如果10个线程几乎同时完成加载,那么托管对象上下文将运行10次。

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

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

如何制作一个接收块的函数,但是如果该块在1秒钟之前运行,它将不会运行块,而是将第二次运行推迟到1秒,无论多久该函数被调用。

3 个答案:

答案 0 :(得分:2)

Mike Ash已经为此实施了timer class

您需要使用行为类型初始化它,具体取决于您想要的确切行为:

  • MABGTimerDelay表示每次拨打afterDelay:1.0 do:^{ /*code*/ }时,它都会设置开火日期,以便在最后电话后仅运行一整秒。
  • MABGTimerCoalesce表示每次拨打afterDelay:1.0 do:^{ /*code*/ }时,它都会将开火日期设置回来,以便在第一次电话后仅运行一整秒。

如果它已经运行,两种行为都允许你再次运行它,但只有在延迟再次运行之后。

答案 1 :(得分:1)

如果运行的块始终相同,则可以在一秒间隔内运行一个循环来检查布尔值,并且只有在布尔值为YES时才执行该块。像这样:

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

当线程完成加载时,你只需设置needsUpdate = YES,循环就可以完成剩下的工作。

答案 2 :(得分: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是一个实例变量。