title: NSOperationOperationQueue cancelAllOperations method won't stop operations
body: <p>How to cancel all operations in NSOperationQueue? I used cancelAllOperations method, but it didn't work, the NSOperationQueue is still calling server to upload photo.</p>
  
  <p>I put every single connection on NSOperationQueue with loop.        </p>
  
  <pre><code>- (void)sendingImage:(NSArray *)imgArray compression:(CGFloat)compression
  {    
      hud = [MBProgressHUD showHUDAddedTo: self.view animated: YES];
      hud.label.text = [NSString stringWithFormat: @"Waiting for Loading"];
      [hud.button setTitle: @"Cancel" forState: UIControlStateNormal];
      [hud.button addTarget: self action: @selector(cancelWork:) forControlEvents: UIControlEventTouchUpInside];
  
      __block int photoFinished = 0;
  
      self.queue = [[NSOperationQueue alloc] init];
      self.queue.maxConcurrentOperationCount = 5;
      [self.queue addObserver: self forKeyPath: @"operations" options: 0 context: NULL];
  
      NSBlockOperation *operation = [[NSBlockOperation alloc] init];
      __weak NSBlockOperation *weakOperation = operation;    
      __block NSString *response = @"";
  
      for (int i = 0; i &lt; imgArray.count; i++) {
  
          operation = [NSBlockOperation blockOperationWithBlock:^{
              [self uploadingPhoto];
          }];
  
          [operation setCompletionBlock:^{
              NSLog(@"Operation 1-%d Completed", i);
              photoFinished++;
  
              dispatch_async(dispatch_get_main_queue(), ^{
                  hud.label.text = [NSString stringWithFormat: @"%d photo complete uploading", photoFinished];
              });
          }];
  
          [self.queue addOperation: operation];
      }
  }
  </code></pre>
  
  <p>I want to press cancel button on MBProgressHUD to first canceled all the NSURLSessionDataTask and then cancel all operations, but didn't work.</p>
  
  <pre><code>- (void)cancelWork:(id)sender {
      NSLog(@"cancelWork");    
      NSLog(@"self.queue.operationCount: %lu", (unsigned long)self.queue.operationCount);
  
      [session getTasksWithCompletionHandler:^(NSArray&lt;NSURLSessionDataTask *&gt; * _Nonnull dataTasks, NSArray&lt;NSURLSessionUploadTask *&gt; * _Nonnull uploadTasks, NSArray&lt;NSURLSessionDownloadTask *&gt; * _Nonnull downloadTasks) {
  
          if (!dataTasks || !dataTasks.count) {
              return;
          }
          for (NSURLSessionDataTask *task in dataTasks) {
              [task cancel];
  
              if ([self.queue operationCount] &gt; 0) {
                  [self.queue cancelAllOperations];
              }
          }
      }];
  }
  </code></pre>
  
  <p>I used semaphore to let NSURLSession become Synchronous connection.</p>
  
  <pre><code>- (void)uploadingPhoto {
  
      request setting above
  
      NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
      config.timeoutIntervalForRequest = 1200;
  
      session = [NSURLSession sessionWithConfiguration: config];
  
      dataTask = [session dataTaskWithRequest: request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
  
          if (error == nil) {
              str = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];
              NSLog(@"str: %@", str);
          }
  
          dispatch_semaphore_signal(semaphore);
      }];
      NSLog(@"task resume");
      [dataTask resume];
  
      dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
  
      return str;
  }
  </code></pre>
  
  <p>Any comments or solutions will be greatly appreciated.</p>