title: Completion handlers in Swift 3.0
body: <p>I am using the code below to sync data with my server. After completing the task, I would like to call:</p>
  
  <pre><code>self.refreshControl?.endRefreshing()
  </code></pre>
  
  <p>However, I would like to make sure it happens after anything that might happen inside this method. Is this where I would use a completion handler? It is confusing to me because I am already running code that gets executed after getting the http response. If I add a completion handler, does it get executed after the http response is received? And could I put my endRefreshing() code there that would happen after anything that might happen in the code below?
  Thanks!</p>
  
  <pre><code>func syncCustomers(token: String) {
      let url:NSURL = NSURL(string: Constants.Api.BaseUrl + "api/customer")!
      let session = URLSession.shared
      let request = NSMutableURLRequest(url: url as URL)
      request.setValue("Bearer \(token)", forHTTPHeaderField: "Authorization")
      request.httpMethod = "GET"
      let task = session.dataTask(with: request as URLRequest) { (data, response, error) in
          guard let data = data else { return }
          do {
              if error != nil {
                  self.showAlert(title: "Error", message: error!.localizedDescription)
              }
              else if let httpResponse = response as? HTTPURLResponse {
                  if httpResponse.statusCode == 200 {
                      let json = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as? Array&lt;Any&gt;
                      DispatchQueue.global().async {
                          for item in json! {
                              if let customer = Customer(json: item as! [String : Any]) {
                                  _ = SqliteDB.instance.replaceCustomer(customer: customer)
                              }
                          }
                          self.customers = SqliteDB.instance.getCustomers()
                          self.tableView.reloadData()
                      }
                  } else if httpResponse.statusCode == 401 {
                      self.showAlert(title: "Error", message: "Unauthorized. Please try logging in again.")
  
                  }
              }
          } catch let error as NSError {
              self.showAlert(title: "Error", message: error.localizedDescription)
          }
      }
      task.resume()
  }
  </code></pre>