squarehippo10
squarehippo10

Reputation: 1945

NSURLSession completion handler very slow

When I run the following code, I can print a response almost immediately, however, it can take ten seconds or more to appear in my view. It seems like most similar problems are caused by the session and the handler being on different threads. But why does it work eventually? Very confused...

func downloadDetails(completed: DownloadComplete) {
   let url = NSURL(string: _detailsURL)!
   let session = NSURLSession.sharedSession()
   let task = session.dataTaskWithURL(url) { (data, response, error) -> Void in

      do {
         let dict = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.AllowFragments) as! [String:AnyObject]

             if let eyeColor = dict["eyeColor"] as? String {
                self._eyeColor = eyeColor
             }
          }
          catch {
             print("json error: \(error)")
          }
   }
   task.resume()
}

Upvotes: 0

Views: 1501

Answers (3)

anthony
anthony

Reputation: 1

For Swift 3 you can use this:

DispatchQueue.main.async() {
   self._eyeColor = eyeColor
}

Upvotes: 0

Amorn Narula
Amorn Narula

Reputation: 323

You need to send your UI updates to the main queue, If you try to update it without sending it to the main queue it can take over a minute to update it.

func downloadDetails(completed: DownloadComplete) {
    let url = NSURL(string: _detailsURL)!
    let session = NSURLSession.sharedSession()
    let task = session.dataTaskWithURL(url) { (data, response, error) -> Void in

        do {
            let dict = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.AllowFragments) as! [String:AnyObject]

            if let eyeColor = dict["eyeColor"] as? String {
                dispatch_async(dispatch_get_main_queue()) {
                    self._eyeColor = eyeColor
                }
            }
        }
        catch {
            print("json error: \(error)")
        }
    }
    task.resume()
}

Upvotes: 2

Reshmi Majumder
Reshmi Majumder

Reputation: 961

Use :

dispatch_async(dispatch_get_main_queue()) {

/// to load your UI

}

Upvotes: 1

Related Questions