What are the benefits of using NSURLSession?
There are a number of new advantages and benefits of using NSURLSession:
- Uploads and Downloads can be done in the Background
- When the NSURLSession is created, a configuration option can be selected to allow background networking. This helps to save battery life, supports multitasking and allows developers to use the same delegate model as in-process transfers.
- Allows the pause and resume for network operations
- When the NSURLSession API is utilized, any networking task can be paused, stopped and restarted. There is no NSOperation subclassing required.
- Configurable container for storing network request configuration
- Each NSURLSession provides a configurable container for storing network requests. For instance, for setting an HTTP header option, we will need to only do this once and each subsequent request will utilize the same configuration
- Allows a private storage which is subclassable.
- Each NSURLSession is subclassable and one can configure a session to use private storage on a per session basis. This allows one to have private storage objects outside of the global state.
- Improved authentication handling
- When using NSURLConnection, if an authentication challenge was issued, the challenge would come back for an arbitrary request, so one would not know exactly what request was getting the challenge. However, with NSURLSession, the delegate handles the authentication.
- Rich delegate model
- NSURLConnection does have some asynchronous block based methods. However, a delegate cannot be used with them.
- Uploads and downloads allowed through the file system.
- This encourages a separation of the data (i.e. file contents) from the metadata (i.e. URL and settings)
NSURLSession is designed as a replacement API for NSURLConnection. An NSURLSession is made using an NSURLSessionConfiguration with an optional delegate. After the session is established, the network requirements are satisfied by creating NSURLSessionTask.
According to Apple's URL Loading Programming Guide, you can use the
NSURLSessionAPI in two ways: with a system-provided delegate or with your own delegate. In general, you must use your own delegate if your app does any of the following:
- Uses background sessions to download or upload content while your app is not running.
- Performs custom authentication.
- Performs custom SSL certificate verification.
- Decides whether a transfer should be downloaded to disk or displayed based on the MIME type returned by the server or other similar criteria.
- Uploads data from a body stream (as opposed to an
- Limits caching programmatically.
- Limits HTTP redirects programmatically.
If your app does not need to do any of these things, your app can use the system-provided delegates.
Basic sequence of method calls that your app needs to make and completion handler calls that your app receives when using NSURLSession with the system-provided delegate :
- Create the NSURLSessionConfiguration
- Create a session specifying a configuration object and a nil delegate.
- Create task objects within a session that each represent a resource request. The task objects are subclasses of
NSURLSessionDownloadTask, depending on the behavior you are trying to achieve. These objects are analogous to
NSURLConnectionobjects, but give you more control and a unified delegate model.
- We need to have our delegate implement the required methods from the NSURLSessionDownloadDelegate protocol.
- When a task completes, the NSURLSession object calls the task's completion handler.
- When your app no longer needs a session, invalidate it by calling either either
invalidateAndCancel(to cancel outstanding tasks) or
finishTasksAndInvalidate(to allow outstanding tasks to finish before invalidating the object).
NSURLSessionclass without providing delegates, your app must create tasks using a call that takes a
completionHandlerparameter, because otherwise it cannot obtain data from the class.
NSURLSessiondoes not report server errors through the error parameter. The only errors your app receives through the error parameter are client-side errors, such as being unable to resolve the hostname or connect to the host. The error codes are described in
URL Loading System Error Codes. Server-side errors are reported through the HTTP status code in the
NSHTTPURLResponseobject. For more information, read the documentation for the
Step #1: Creating the NSURLSessionConfiguration
There are three ways to create an NSURLSessionConfiguration:
- creates a configuration object that uses the global cache, cookie and credential storage objects. This configuration provides a session to look very much like the NSURLConnection.
- This configuration is for "private" sessions and has no persistent storage for cache, cookie or credential storage objects
- This configuration is used for making networking calls from remote push notifications or while the app is suspended.
Once the NSURLSessionConfiguration is created, then the setting of various properties on it can be done as follows:
Step #2: Creating the Session
With NSURLSession, you can create the tasks using the block based convenience methods, set up a delegate or both. For instance, if you want to download an image, then you will need to create an NSURLSessionDownloadTask.