dams net
dams net

Reputation: 301

swift UIActivityIndicatorView while NSURLConnection

I know how to animate the UIActivityIndicatorView I know how to make a connection with NSURLConnection.sendSynchronousRequest

But I don't know how to animate the UIActivityIndicatorView WHILE making a connection with NSURLConnection.sendSynchronousRequest

Thanks

Upvotes: 5

Views: 7775

Answers (2)

Rob
Rob

Reputation: 437432

Don't use sendSynchronousRequest from main thread (because it will block whatever thread you run it from). You could use sendAsynchronousRequest, or, given that NSURLConnection is deprecated, you should really use NSURLSession, and then your attempt to use UIActivityIndicatorView should work fine.

For example, in Swift 3:

let indicator = UIActivityIndicatorView(activityIndicatorStyle: .gray)
indicator.center = view.center
view.addSubview(indicator)
indicator.startAnimating()

URLSession.shared.dataTask(with: request) { data, response, error in
    defer {
        DispatchQueue.main.async {
            indicator.stopAnimating()
        }
    }

    // use `data`, `response`, and `error` here
}

// but not here, because the above runs asynchronously

Or, in Swift 2:

let indicator = UIActivityIndicatorView(activityIndicatorStyle: .Gray)
indicator.center = view.center
view.addSubview(indicator)
indicator.startAnimating()

NSURLSession.sharedSession().dataTaskWithRequest(request) { data, response, error in
    defer {
        dispatch_async(dispatch_get_main_queue()) {
            indicator.stopAnimating()
        }
    }

    // use `data`, `response`, and `error` here
}

// but not here, because the above runs asynchronously

Upvotes: 13

Patru
Patru

Reputation: 4551

As pointed out by @Rob in the comment, as long as you use a SynchronousRequest it will block your UI-thread and you won't be able to animate anything. Chris does a good job at explaining the two modes of NSURLConnection in this article (though for Objective-C, but you will get the idea). Among other things he compares the two modes as

Async or Sync?

So should you perform an asynchronous request or use a synchronous one for your application? I find that in the large majority of times, I’m using the async request because otherwise the UI would be frozen while the synchronous request is doing its thing and that’s a big problem when the user is performing gestures or touches and the screen is unresponsive. Unless I’m firing off a request to do something really simple and quick like ping a server, I default to using the async pattern.

This summarizes your options better than I could state it. So you really should learn about the asynchronous variant in order to be able to do your animation.

Upvotes: 1

Related Questions