title: Moving to a background NSURLSession from a foreground NSURLSession - Handling Tasks in Process
body: <p>I am trying to correctly handle in-process NSURLSessionTasks in the event that the app enters the background (e.g from a home button press). I am currently taking the approach of copying the in-process tasks across to the background queue (see code below). I am finding however that the background tasks are behaving erratically and not always finishing. Can any spot what I might be doing wrong / advise on the best approach ?</p>
  
  <pre><code>- (void)appWillResignActive : (NSNotification *)notification {
      UIApplication *app = [UIApplication sharedApplication];
  
      // Register expiring background task
      __block UIBackgroundTaskIdentifier bgTaskId =
      [app beginBackgroundTaskWithExpirationHandler:^{
          bgTaskId = UIBackgroundTaskInvalid;
      }];
  
      [self switchToBackground];
      [app endBackgroundTask:bgTaskId];
  
  }
  
  - (void)appWillBecomeActive : (NSNotification *)notification {
      [self switchToForeground];
  }
  
  - (void)switchToBackground
  {
      NSLog(@"Switch to background line 217 Network Manager");
      if ([state isEqualToString: kdownloadManagerStateForeground]) {
          [urlSession getTasksWithCompletionHandler:^(NSArray *dataTasks, NSArray *uploadTasks, NSArray *downloadTasks) {
              for (NSURLSessionDownloadTask *downloadTask in downloadTasks) {
                  [downloadTask cancelByProducingResumeData:^(NSData *resumeData) {
                      NSURLSessionDownloadTask *downloadTask = [self.backgroundSession downloadTaskWithResumeData:resumeData];
                      [downloadTask resume];
                  }];
              }
          }];
  
          state = kdownloadManagerStateBackground;
      }
  }
  
  - (void)switchToForeground
  {
      if ([state isEqualToString: kdownloadManagerStateBackground]) {
          [backgroundSession getTasksWithCompletionHandler:^(NSArray *dataTasks, NSArray *uploadTasks, NSArray *downloadTasks) {
              for (NSURLSessionDownloadTask *downloadTask in downloadTasks) {
                  [downloadTask cancelByProducingResumeData:^(NSData *resumeData) {
                      NSURLSessionDownloadTask *downloadTask = [self.urlSession downloadTaskWithResumeData:resumeData];
                      [downloadTask resume];
                  }];
              }
          }];
  
          state = kdownloadManagerStateForeground;
      }
  }
  </code></pre>