2014-06-12 1 views
0

J'ai essayé de faire fonctionner la fonction qui sera invoquée toutes les minutes (sans minuterie).
Lorsque je lance l'application, elle s'exécute après une minute et plus jamais.
Je manque probablement quelque chose mais ne peux pas trouver quoi?
Impossible d'exécuter l'appel de fonction sur X minutes plus d'une fois dans 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

suis peu confus! n'est pas dispatch_after diffère l'exécution par le temps, ne pas répéter à intervalles? –

+0

Droit @JeslyVarghese juste faire un appel récursif en utilisant le même gestionnaire de répartition dans la fonction elle-même – channi

+0

@channi: ah! récursivité .. Est-ce bon? pour quelque chose qui peut être réalisé par NSTimer. Une pile d'appel de fonction retardée me redoute. Y a-t-il un contrôle sur l'exécution alors? –

Répondre

2
 
- (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]; 

    }); 
} 

0

Essayez ceci:

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); 
} 
Questions connexes