在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; 
} 
+0

感到有点迷茫!是不是dispatch_after按时间推迟执行,而不是间隔地重复执行? –

+0

Right @JeslyVarghese通过在函数本身中使用相同的调度处理函数进行递归调用 – channi

+0

@channi:啊!递归..是好的吗?用于NSTimer可以实现的功能。一堆延迟的函数调用让我害怕。那么是否有对执行的控制权? –

 
- (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); 
}