CLIENT SERVER COMMUNICATION · Source: Efficient JSON in Swift with Functional Concepts and...

Preview:

Citation preview

CLIENT SERVER COMMUNICATION

AGENDA

NSURLSession

Handling JSON

Third party networking libraries

NSURLSESSION

NSURLSESSION

Class provided by Foundation library that allows

issuing HTTP requests

CANONICAL EXAMPLElet imageView = UIImageView()

let url = NSURL(string: "http://www.sbs.com.au/news/sites/sbs.com.au.news/files/styles/full/public/g1369638954952825892.jpg.png?itok=eI4dUGhC&mtime=1429064409")!let urlRequest = NSURLRequest(URL: url)

let session = NSURLSession.sharedSession()let task = session.dataTaskWithRequest(urlRequest) { data, response, error in if let data = data { let image = UIImage(data: data) dispatch_async(dispatch_get_main_queue()) { imageView.image = image } }}

task.resume()

CANONICAL EXAMPLE

1. Retrieve a session from NSURLSession

2. Create a task using that session

3. Provide a delegate or callback to deal with the response

NSURLSESSION - TASK TYPES

NSURLSessionDataTask: A task for retrieving the contents

of a URL as an NSData object

NSURLSessionUploadTask: A task for uploading a file,

then retrieving the contents of a URL as an NSData object

NSURLSessionDownloadTask: A task for retrieving the

contents of a URL as a temporary file on disk

Background compatible

Not background compatible!

Source: NSURLSession reference

POST EXAMPLElet content = ["post": "test content"]let jsonData = try! NSJSONSerialization.dataWithJSONObject(content, options: NSJSONWritingOptions(rawValue: 0))

let urlPost = NSURL(string: "http://jsonplaceholder.typicode.com/posts")!let urlRequestPost = NSMutableURLRequest(URL: urlPost)urlRequestPost.HTTPMethod = "POST"urlRequestPost.HTTPBody = jsonData

let postTask = session.dataTaskWithRequest(urlRequestPost) { data, response, error in if let data = data { print(response) }}

postTask.resume()

HANDLING JSON

HANDLING JSON

Foundation framework provides NSJSONSerialization

Class is poorly suited for Swift 😢

HANDLING JSON

let jsonOptional: AnyObject! = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions(0), error: &jsonErrorOptional)

if let json = jsonOptional as? Dictionary<String, AnyObject> { if let id = json["id"] as? Int { if let name = json["name"] as AnyObject? as? String { if let email = json["email"] as AnyObject? as? String { let user = User(id: id, name: name, email: email) callback(user) } } }}

😢 😢 😢 😢 😢 😢 😢 😢 😢 😢 😢 😢 😢Source: Efficient JSON in Swift with Functional Concepts and Generics

HANDLING JSON

For sane JSON parsing code we need to use third party libraries that implement type checking for us

There are many libraries available: SwiftyJSON, Argo, Gloss, etc.

HANDLING JSON WITH GLOSSY - 1struct Post: Glossy { var title: String? var content: String? init?(json: JSON) { self.title = "title" <~~ json self.content = "content" <~~ json } init(title: String, content: String) { self.title = title self.content = content } func toJSON() -> JSON? { return jsonify([ "title" ~~> self.title, "content" ~~> self.content ]) }}

HANDLING JSON WITH GLOSSY - 2let jsonPost = Post(title: "Test", content: "Test Content").toJSON()!let jsonData = try! NSJSONSerialization.dataWithJSONObject(jsonPost, options: NSJSONWritingOptions(rawValue: 0))

let urlPost = NSURL(string: "http://jsonplaceholder.typicode.com/posts")!let urlRequestPost = NSMutableURLRequest(URL: urlPost)urlRequestPost.HTTPMethod = "POST"urlRequestPost.HTTPBody = jsonDataurlRequestPost.setValue("application/json", forHTTPHeaderField: "content-type")

let postTask = session.dataTaskWithRequest(urlRequestPost) { data, response, error in if let data = data { let json = try! NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions(rawValue: 0)) let post = Post(json: json as! JSON) print(post) }}

postTask.resume()

THIRD PARTY NETWORKING LIBRARIES

THIRD PARTY NETWORKING

Networking code encounters issues that are similar for all different kinds of apps

Third party libraries help in solving these common problems (e.g. parsing responses from as server)

THIRD PARTY NETWORKING

Alamofire: an abstraction on top of NSURLSession with a simplified API

Moya: built on top of Alamofire, improves modeling of API client

Tiny networking: a minimal networking library by Chris Eidhof, read accompanying blog post

SUMMARY

SUMMARY

NSURLSession is the main networking API

(Sane) JSON parsing in Swift 2 requires third party libraries

Popular third party networking libraries provide abstractions over NSURLSession

ADDITIONAL RESOURCES