在IOS中不能执行一次以上的函数调用
问题描述:
我试图使函数每分钟都会调用(,没有使用定时器)。
当我运行应用程序时,它会在一分钟后执行,而不会再次执行。
我可能会错过一些东西,但无法找到什么?
在IOS中不能执行一次以上的函数调用
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
NSDate *date = [NSDate date];
NSDateComponents *dateComponents = [[NSCalendar currentCalendar] components:NSSecondCalendarUnit fromDate:date];
NSTimeInterval timeSinceLastSecond = date.timeIntervalSince1970 - floor(date.timeIntervalSince1970);
NSTimeInterval timeToNextMinute = (60 - dateComponents.second) - timeSinceLastSecond;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(timeToNextMinute * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self myFunction];
});
return YES;
}
答
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [self executeEveryOneMinute]; return YES: } - (void)executeEveryOneMinute { [self myFunction] dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(60 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [self executeEveryOneMinute]; }); }
答
试试这个:
void runBlockInSeconds(dispatch_block_t block,int seconds) {
//initial block
block();
//get current time
struct timespec startPopTime ;
gettimeofday((struct timeval*)&startPopTime, NULL);
//trim the time
startPopTime.tv_sec -= (startPopTime.tv_sec % seconds);
startPopTime.tv_sec +=seconds;
dispatch_time_t time = dispatch_walltime(&startPopTime, 0);
dispatch_block_t __block afterBlock = ^(void) {
block();
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, NSEC_PER_SEC * seconds), dispatch_get_main_queue(), afterBlock);
};
dispatch_after(time, dispatch_get_main_queue(), afterBlock);
}
感到有点迷茫!是不是dispatch_after按时间推迟执行,而不是间隔地重复执行? –
Right @JeslyVarghese通过在函数本身中使用相同的调度处理函数进行递归调用 – channi
@channi:啊!递归..是好的吗?用于NSTimer可以实现的功能。一堆延迟的函数调用让我害怕。那么是否有对执行的控制权? –