title: Can't cancel executing operations in OperationQueue swift
body: <p>Im doing some lengthy calculations to create chart data on a background thread</p>
  
  <p>i was originally use GCD, but every time a user filters the chart data by hitting a button, the chart data needs to be recalculated, if the user clicks the chart data filtering buttons very quickly (power user) then the chart loops through each drawing as each GCD dispatch async finishes</p>
  
  <p>I realize that I can't cancel threads with GCD so I've moved to trying to implement an <code>OperationQueue</code></p>
  
  <p>I call <code>cancelAllOperations()</code> before adding a new operation to the queue</p>
  
  <p>The operations on the queue act funky, sometimes it seems like they are cancelled, some times it seems like the one that finished is not the most recent one put on the queue.</p>
  
  <p>I am also having trouble cancelling a executing operation as the operation's .isCancelled property is never true when i check for it in the operations completion block</p>
  
  <p>What i really want is if the chart data calculation is currently happening in a background thread, and a user clicks another filter button and kicks off another chart calculation on a background thread, the previous chart background thread calculation is terminated and "replaced" with the most recently added operation</p>
  
  <p>is this possible? 
  here is some code:</p>
  
  <pre><code>func setHistoricalChart() -&gt; Void {
      self.lineChartView.clear()
      self.lineChartView.noDataText = "Calculating Historical Totals, Please Wait..."
  
      self.historicalOperationsQueue.qualityOfService = .utility
      self.historicalOperationsQueue.maxConcurrentOperationCount = 1
      self.historicalOperationsQueue.name = "historical operations queue"
  
      let historicalOperation = Operation()
      historicalOperation.completionBlock = { [weak self] in
          //dictionary of feeds, array of data for each feed
          var valuesByFeed = [String:[String]?]()
          var dates = [String:[String]?]()
          var chartDataSets = [IChartDataSet]()
  
          //get data and values from DataMOs in the activeFeeds
          if (self?.activeFeeds.count)! &gt; 0 {
              //check if operation is cancelled
              if historicalOperation.isCancelled {
                  return
              }
              for (key, feed) in (self?.activeFeeds)! {
                  dates[key] = feed?.datas?.flatMap({ Utils.formatUTCDateString(utcDateString: ($0 as! DataMO).utcDateString) })
                  valuesByFeed[key] = feed?.datas?
                      .sorted(by: { (($0 as! DataMO).utcDateString)! &lt; (($1 as! DataMO).utcDateString)! })
                      .flatMap({ ($0 as! DataMO).value })
              }
  
              //Create Chart Data
              for (key, valuesArray) in valuesByFeed {
                  var dataEntries = [ChartDataEntry]()
                  for (index, value) in (valuesArray?.enumerated())! {
                      let dataEntry = ChartDataEntry(x: Double(index), y: Double(value)!)
                      dataEntries.append(dataEntry)
                  }
                  let singleChartDataSet = LineChartDataSet(values: dataEntries, label: key)
                  singleChartDataSet.drawCirclesEnabled = false
                  switch key {
                  case "Solar":
                      singleChartDataSet.setColors(UIColor(red: 230/255, green: 168/255, blue: 46/255, alpha: 1))
                      singleChartDataSet.drawFilledEnabled = true
                      singleChartDataSet.fillColor = UIColor(red: 230/255, green: 168/255, blue: 46/255, alpha: 0.8)
                      break
                  case "Wind":
                      singleChartDataSet.setColors(UIColor(red: 73/255, green: 144/255, blue: 226/255, alpha: 1))
                      singleChartDataSet.drawFilledEnabled = true
                      singleChartDataSet.fillColor = UIColor(red: 73/255, green: 144/255, blue: 226/255, alpha: 0.8)
                      break
                  case "Battery":
                      singleChartDataSet.setColors(UIColor(red: 126/255, green: 211/255, blue: 33/255, alpha: 1))
                      singleChartDataSet.drawFilledEnabled = true
                      singleChartDataSet.fillColor = UIColor(red: 126/255, green: 211/255, blue: 33/255, alpha: 0.8)
                      break
                  case "Gen":
                      singleChartDataSet.setColors(UIColor(red: 208/255, green: 1/255, blue: 27/255, alpha: 1))
                      singleChartDataSet.drawFilledEnabled = true
                      singleChartDataSet.fillColor = UIColor(red: 208/255, green: 1/255, blue: 27/255, alpha: 0.8)
                      break
                  case "Demand":
                      singleChartDataSet.setColors(UIColor(red: 128/255, green: 133/255, blue: 233/255, alpha: 1))
                      singleChartDataSet.drawFilledEnabled = true
                      singleChartDataSet.fillColor = UIColor(red: 128/255, green: 133/255, blue: 233/255, alpha: 0.8)
                      break
                  case "Prod":
                      singleChartDataSet.setColors(UIColor(red: 241/255, green: 92/255, blue: 128/255, alpha: 1))
                      singleChartDataSet.drawFilledEnabled = true
                      singleChartDataSet.fillColor = UIColor(red: 241/255, green: 92/255, blue: 128/255, alpha: 0.8)
                      break
                  default:
                      break
                  }
                  chartDataSets.append(singleChartDataSet)
              }
          }
  
          //check if operation is cancelled
          if historicalOperation.isCancelled {
              return
          }
  
          //set chart data
          let chartData = LineChartData(dataSets: chartDataSets)
  
          //update UI on MainThread
          OperationQueue.main.addOperation({
              if (self?.activeFeeds.count)! &gt; 0 {
                  self?.lineChartView.data = chartData
              } else {
                  self?.lineChartView.clear()
                  self?.lineChartView.noDataText = "No Feeds To Show"
              }
          })
      }
      historicalOperationsQueue.cancelAllOperations()
      historicalOperationsQueue.addOperation(historicalOperation)
  }
  </code></pre>
  
  <p><a href="https://i.stack.imgur.com/qNxQ8.png" rel="noreferrer"><img src="https://i.stack.imgur.com/qNxQ8.png" alt="enter image description here"></a></p>