Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PerformFetchWithCompletionHandler called twice when simulating with Xcode

In Xcode 7.0.1 the "simulate background" fetch command causes performFetchWithCompletionHandler to be triggered twice.

Is this an Xcode debugging error, or can this happen on a device running a release build of the application.

Update Now we have Xcode 7.1.1 and still performFetchWithCompletionHandler is called twice. Since I am not sure if this also happens "in the wild" I am keeping a state if my fetch action is already running.

- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(nonnull void (^)(UIBackgroundFetchResult))completionHandler {
    if (self.performingFetch) {
        return completionHandler(UIBackgroundFetchResultNoData);
    }
    self.performingFetch = YES;
    ...
    self.performingFetch = NO;
}
like image 591
MarkHim Avatar asked Oct 13 '15 14:10

MarkHim


1 Answers

I got around this issue by declaring a static boolean in the App Delegate, and then using the boolean to get the background fetch to perform once

if (!runOnce)
{
    [submission startSubmissionProcessWithCompletetionHandler:^(UIBackgroundFetchResult result){
        NSDate *fetchStart = [NSDate date];

        completionHandler(result);

        NSDate *fetchEnd = [NSDate date];
        NSTimeInterval timeElapsed = [fetchEnd timeIntervalSinceDate:fetchStart];
        NSLog(@"Background Fetch Duration: %f seconds", timeElapsed);
    }];
    runOnce = YES;
}
else
{
    completionHandler(UIBackgroundFetchResultNoData);
    runOnce = NO;
}
like image 154
harpsicord86 Avatar answered Oct 07 '22 01:10

harpsicord86