2

I have the below JSON response and i want to get the id for the hit objects:

{
    "totalHits":500,
    "hits":[
        {
            "largeImageURL":"https://pixabay.com/get/ea32b90a2af3073ed1584d05fb1d4190e070e4d71aac104491f1c270a0eeb7b0_1280.jpg",
            "webformatHeight":426,
            "webformatWidth":640,
            "likes":0,
            "imageWidth":4494,
            "id":3785276,
            "user_id":10546560,
            "views":21,
            "comments":0,
            "pageURL":"https://pixabay.com/en/port-river-liner-sea-cruise-3785276/",
            "imageHeight":2996,
            "webformatURL":"https://pixabay.com/get/ea32b90a2af3073ed1584d05fb1d4190e070e4d71aac104491f1c270a0eeb7b0_640.jpg",
            "type":"photo",
            "previewHeight":99,
            "tags":"port, river, liner",
            "downloads":9,
            "user":"LunevAndrey",
            "favorites":0,
            "imageSize":3306757,
            "previewWidth":150,
            "userImageURL":"",
            "previewURL":"https://cdn.pixabay.com/photo/2018/10/31/06/55/port-3785276_150.jpg"
        }
   ]
}

This is what I have so far:

import UIKit
import SDWebImage

class Model: NSObject {
    var title : Any!
    
    init (dict :  [String:Any]) {
        self.title = (((dict as AnyObject)["hits"] as! [String:AnyObject])) ["id"] as? Any
        
 
    }
}

And in view controller I have coding as following:

import UIKit
import Alamofire



class CollectionView: UIViewController,UICollectionViewDelegate,UICollectionViewDataSource,UICollectionViewDelegateFlowLayout {
    
    let url1 = ["URL path string"]
    @IBOutlet weak var collection: UICollectionView!
    var arrList = [Model]()
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        reequest()
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(true)
        self.collection.reloadData()
        
    }
    
        func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
           return arrList.count
            
        }
        
        func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
            
            let cell: firstCollectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! firstCollectionViewCell
            let objct = arrList[indexPath.row]
            cell.label.text =  objct.title as AnyObject as? String
       
            return cell
        }

        func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
            
             let width = (self.view.frame.size.width - 5  * 3 ) / 2 //some width
             let height = width * 1.34 //ratio
            return CGSize(width: width, height: height)
        }
    
    
    func reequest() {
        
        let url = URL(string: "URL path string")
        Alamofire.request(url!).responseJSON {(response) in
         switch (response.result){
            case .success:
                if let data = response.result.value{
                    if let arrdata = data as? [[String:Any]]{
                
                        for dataList in arrdata {
                            print(dataList)
                            let obj = Model(dict: dataList)
                            self.arrList.append(obj)
                            self.collection.reloadData()
                        }
                    }
                }
            case .failure(let error):
                print("error to print the data \(error)")
            }
        }
    }
}

2 Answers 2

1

Codable's are easy to use and should be the best option in such situations. Below is the complete re-write of the models according to the response,

class HitItem: Codable {
    var id : Int
    var user: String
}

class HitsResponse: Codable {
    var totalHits: Int
    var hits: [HitItem]
}

class CollectionView: UIViewController,UICollectionViewDelegate,UICollectionViewDataSource,UICollectionViewDelegateFlowLayout {

    let url1 = ["URL path string"]
    @IBOutlet weak var collection: UICollectionView!
    var arrList = [HitItem]()


    override func viewDidLoad() {
        super.viewDidLoad()
        reequest()
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(true)
        self.collection.reloadData()

    }

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return arrList.count

    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

        let cell: firstCollectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! firstCollectionViewCell
        let objct = arrList[indexPath.row]
        cell.label.text =  String(objct.id)

        return cell
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {

        let width = (self.view.frame.size.width - 5  * 3 ) / 2 //some width
        let height = width * 1.34 //ratio
        return CGSize(width: width, height: height)
    }


    func reequest() {

        let url = URL(string: "URL path string")
        Alamofire.request(url!).responseJSON {(response) in
            switch (response.result){
            case .success:
                if let data = response.data {
                    do {
                        let response = try JSONDecoder().decode(HitsResponse.self, from: data)
                        self.arrList = response.hits
                        self.collection.reloadData()
                    } catch {
                        print(error.localizedDescription)
                    }
                }
            case .failure(let error):
                print("error to print the data \(error)")
            }
        }
    }
}
Sign up to request clarification or add additional context in comments.

6 Comments

What is self.arrList = response.hits stand for?
Assigning the hits list to your dataSource array i.e, arrList.
Awesome. It's working. Thanks. But I have no idea about Codable's.
You can follow some tutorial. It is recommended to use Codable when you want to interact with JSON.
Suppose if my JSON start with the [ { "albumId": 1, "id": 1, "title": "accusamus beatae ad facilis cum similique qui sunt", "url": "https://via.placeholder.com/600/92c952", "thumbnailUrl": "https://via.placeholder.com/150/92c952" }, Then can i use above code? If yes then How?
|
0

try to do Something like this.

    case .success:
            if let data = response.result.value{
                if let arrdata = data as? [[String:Any]]{

                    for dataList in arrdata {
                        print(dataList)
                        let obj = Model(dict: dataList)
                        self.arrList.append(obj)
                        self.collection.reloadData()
                    }


                    for index in 0..<arrdata.count {
                        print(arrdata[index]["id"])
                    }
                }
              }

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.