使用JSON数据填充UIComponents

时间:2018-05-30 20:36:35

标签: json swift uitableview

我必须解析并发现一种优雅的方式来处理我的解析数据,并使用它来正确填充UIElements,例如UITableViews,UICollectionViews等。我将在下面发布我如何解析和也是JSON文件。

import Foundation

struct Contents : Decodable {

    let data : [Content]
}

struct Content : Decodable {
    let id : Int
    let descricao : String
    let urlImagem : String


}

API响应文件:

import Foundation


var audioBook = [Content]()


func getAudiobooksAPI() {

        let url = URL(string: "https://alodjinha.herokuapp.com/categoria")

        let session = URLSession.shared

        guard let unwrappedURL = url else { print("Error unwrapping URL"); return }

        let dataTask = session.dataTask(with: unwrappedURL) { (data, response, error) in

            guard let unwrappedDAta = data else { print("Error unwrapping data"); return }

            do {



                     let posts2 = try JSONDecoder().decode(Contents.self, from: unwrappedDAta)
                         audioBook = posts2.data




            } catch {
                print("Could not get API data. \(error), \(error.localizedDescription)")
            }
        }
        dataTask.resume()
    }

TableView文件:

  

如何使用我解析的数据填充?我真的很难做到这一点。我需要一个解释来指导我如何使用优雅的方式和高级开发人员。

import UIKit

class ViewController: UIViewController, UICollectionViewDataSource {

    @IBOutlet var collectionView: UICollectionView!


    override func viewDidLoad() {
        super.viewDidLoad()



        getAudiobooksAPI()




    }

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {


        return  ?????
    }

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

        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectionViewCell", for: indexPath) as! CollectionViewCell

               ???????

        return cell

    }
}
  

JSON:

JSON Model

1 个答案:

答案 0 :(得分:0)

只需使用completion Handler

更新您的API服务即可
func getAudiobooksAPI(_ completion:@escaping ([Content])->Void) {

        let url = URL(string: "https://alodjinha.herokuapp.com/categoria")

        let session = URLSession.shared

     guard let unwrappedDAta = data else {  completion([Content]());  return}

        let dataTask = session.dataTask(with: unwrappedURL) { (data, response, error) in

            guard let unwrappedDAta = data else { print("Error unwrapping data"); return }

            do {



                let posts2 = try JSONDecoder().decode(Contents.self, from: unwrappedDAta)
                completion(posts2.data)



            } catch {
                print("Could not get API data. \(error), \(error.localizedDescription)")
                completion([Content]())

            }
        }
        dataTask.resume()
    }

并像那样使用

import UIKit

class ViewController: UIViewController, UICollectionViewDataSource {

    @IBOutlet var collectionView: UICollectionView!

     var dataSource: [Content] = [Content]()
    override func viewDidLoad() {
        super.viewDidLoad()



         getAudiobooksAPI { (data) in
            DispatchQueue.main.async {
                self.dataSource = data
                self.collectionView.reloadData()
            }
        }




    }

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {


        return  self.dataSource.count
    }

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

        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectionViewCell", for: indexPath) as! CollectionViewCell

             let content = self.dataSource[indexPath.item]

        return cell

    }
}
相关问题