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