web-dev-qa-db-ja.com

XcodeでシミュレートするときにPerformFetchWithCompletionHandlerが2回呼び出されます

Xcode 7.0.1では、「バックグラウンドのシミュレーション」フェッチコマンドにより、performFetchWithCompletionHandlerが2回トリガーされます。

これはXcodeデバッグエラーですか、それともアプリケーションのリリースビルドを実行しているデバイスで発生する可能性があります。

更新これでXcode 7.1.1ができましたが、それでもperformFetchWithCompletionHandlerが2回呼び出されます。これが「実際に」発生するかどうかわからないため、フェッチアクションがすでに実行されている場合は状態を維持しています。

- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(nonnull void (^)(UIBackgroundFetchResult))completionHandler {
    if (self.performingFetch) {
        return completionHandler(UIBackgroundFetchResultNoData);
    }
    self.performingFetch = YES;
    ...
    self.performingFetch = NO;
}
46
MarkHim

この問題を回避するには、App Delegateで静的ブール値を宣言し、ブール値を使用してバックグラウンドフェッチを1回実行します。

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;
}
1
harpsicord86