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

Objective c 如何确保某些代码不会每1秒运行超过1次?,objective-c,xcode,nsmanagedobjectcontext,Objective C,Xcode,Nsmanagedobjectcontext,我有一个程序可以从网上下载成吨的文件 我有几个线程下载数据 调用每个数据后,我需要更新托管对象上下文 如果10个线程大约同时完成加载,那么托管对象上下文将运行10次 事实是我只需要运行一次 我想做的是创建一个接受块的方法 我应该怎么做才能使一个函数接收一个块,但是如果该块在不到1秒之前运行过,它将不会运行该块,而是将第二次运行推迟到1秒,不管调用该函数的频率有多高。Mike Ash已经为此实现了一个 您需要使用行为类型初始化它,具体取决于您想要的行为: MABGTimerDelay表示每次调用

我有一个程序可以从网上下载成吨的文件

我有几个线程下载数据

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

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

事实是我只需要运行一次

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


我应该怎么做才能使一个函数接收一个块,但是如果该块在不到1秒之前运行过,它将不会运行该块,而是将第二次运行推迟到1秒,不管调用该函数的频率有多高。

Mike Ash已经为此实现了一个

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

  • MABGTimerDelay
    表示每次调用
    afterDelay:1.0 do:^{/*code*/}
    时,它都会将启动日期设置回原来的时间,以便在上次调用后只运行一整秒钟
  • MABGTimerCoalesce
    意味着每次调用
    afterDelay:1.0 do:^{/*code*/}
    时,它都会将点火日期设置回原来的时间,以便在第一次调用后只运行一整秒钟

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

Mike Ash已经为此实现了一个

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

  • MABGTimerDelay
    表示每次调用
    afterDelay:1.0 do:^{/*code*/}
    时,它都会将启动日期设置回原来的时间,以便在上次调用后只运行一整秒钟
  • MABGTimerCoalesce
    意味着每次调用
    afterDelay:1.0 do:^{/*code*/}
    时,它都会将点火日期设置回原来的时间,以便在第一次调用后只运行一整秒钟

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

如果运行的块始终相同,则可以在1秒的间隔上运行一个循环,该循环检查布尔值,并且仅在布尔值为“是”时才执行该块。大概是这样的:

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

当线程完成加载时,您只需设置
needsUpdate=YES
,循环就会处理其余部分。

如果运行的块始终相同,则可以让循环以1秒的间隔运行,检查布尔值,并且仅在布尔值为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*\u saveTimer是一个实例变量。

当线程完成时,在主线程中调用该方法。在这种方法中,制作一个延时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*\u saveTimer是一个实例变量