我有一个从网上下载大量文件的程序
我有几个线程下载数据。
调用每个数据后,我需要更新托管对象上下文
如果10个线程几乎同时完成加载,那么托管对象上下文将运行10次。
事实是我只需要运行一次。
我想要做的是创建一个接受块的方法。
如何制作一个接收块的函数,但是如果该块在1秒钟之前运行,它将不会运行块,而是将第二次运行推迟到1秒,无论多久该函数被调用。
答案 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是一个实例变量。