Hello after long time I am writing this blog regarding use of Alamofire with Codable model object for the ease of MVC architecture.
Let’s rewind with some of the post which is used to cover this point:
- How to use Alamofire and SwiftyJSON with Swift?
- How to create a wrapper for Alamofire and SwiftyJSON?
- Use of Codable and Coding Key with JSONEncoder and JSONDecoder in Swift 4
Let see about use of Alamofire with Codable model object
Step 1 – Create Codable object based on JSON response.
Here I am taking an example of a web service which contains JSON related to the contact.
1 2 3 4 5 6 7 8 9 10 11 12 |
{ "id": "c200", "name": "Ravi Tamada", "email": "ravi@gmail.com", "address": "xx-xx-xxxx,x - street, x - country", "gender" : "male", "phone": { "mobile": "+91 0000000000", "home": "00 000000", "office": "00 000000" } } |
So, we can create two Codable files from this JSON as per hierarchy. These would be like as follows:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
struct Contact: Codable { var id : String var name : String var email : String var address : String var gender : String var phone : Phone } struct Phone: Codable { var mobile : String var home : String var office : String } |
As you can see we have created 2 objects Contact and Phone. Here Phone is in sub hierarchy.
Step 2 – Let’s update AFWrapper
As we have previously revised blogs, there is a blog mentioned about to create a wrapper of the Alamofire and SwiftyJSON. We have to replace the SwiftyJSON code to return normal dictionary objects, and after that we will convert that dictionary to the Codable object.
So here I have updated the AFWrapper class file to do that thing:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import UIKit import Alamofire class AFWrapper: NSObject { class func requestGETURL(_ strURL: String, success:@escaping ([String : Any]) -> Void, failure:@escaping (Error) -> Void) { Alamofire.request(strURL).responseJSON { (responseObject) -> Void in print(responseObject) if responseObject.result.isSuccess { success(responseObject.result.value! as! [String : Any]) } if responseObject.result.isFailure { let error : Error = responseObject.result.error! failure(error) } } } } |
Step 3 – Implement and convert the response in object
We will call a web service which contain that kind of JSON response. And after calling the web-service we will decode the object to create the Codable object.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
import UIKit class ViewController: UIViewController { var arrContacts = [Contact]() @IBOutlet var txtContacts: UITextView! override func viewDidLoad() { super.viewDidLoad() AFWrapper.requestGETURL("https://api.androidhive.info/contacts/", success: { (responseObject) in print(responseObject) for aContact in responseObject["contacts"] as! [Any] { do { let jsonData = try JSONSerialization.data(withJSONObject: aContact, options: .prettyPrinted) let reqJSONStr = String(data: jsonData, encoding: .utf8) let data = reqJSONStr?.data(using: .utf8) let jsonDecoder = JSONDecoder() let aContact = try jsonDecoder.decode(Contact.self, from: data!) self.arrContacts.append(aContact) self.txtContacts.text = self.txtContacts.text + aContact.name + " " + aContact.phone.mobile + "\n" print(self.arrContacts) } catch { } } }) { (error) in print(error.localizedDescription) } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } } |
In above sample I have added one text view in the view controller and I am fetching the data from the contacts API. After that using JSONSerialization and JSONDecoder we will get our decoded Contact object with Phone object.
Conclusion
Swift 4 comes with so many updates. We are going to have a great time exploring them all and finding out so much more by using it on further projects. We have learned about Codable and use of it. You too should go check it out and share your experiences with us in the comments section.
Hope you liked the article.
Happy Coding 🙂