-1

I am facing trouble getting image from my json url.

this is my json:

"bank_details": [
    {
        "id": 1,
        "logo": "http://mortgagemarket.ae/webApi/public/mortgage_bank_icons/noorebank.png",
        "name": abc company

    }
]

my swift code to parse the image is this:

import UIKit
class BanksViewController: UIViewController, UITableViewDelegate,UITableViewDataSource {

final let BANKS_URL = "http://www.mortgagemarket.ae/webApi/api/manage_interest_rates"
    @IBOutlet weak var tableView: UITableView!

var bankicon = [String]()
var bankname = [String]()
var bankid = [Int]()

let stringid: String = ""

override func viewDidLoad() {
    super.viewDidLoad()

    self.displayFromDb()
    tableView.dataSource = self
    tableView.delegate = self


}



func displayFromDb()
{
    let tokensp = UserDefaults.standard.string(forKey: "tokenKey")
    let url = NSURL(string: BANKS_URL+"?token="+tokensp!)

    print(url)
    URLSession.shared.dataTask(with: (url as?URL)!, completionHandler: {(data,response,error) ->
        Void in

        if let jsonObj = try? JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? NSDictionary
        {

            print(jsonObj.value(forKey: "bank_details")!)

            if let messageArray = jsonObj.value(forKey: "bank_details") as? NSArray
            {
                print(jsonObj.value(forKey: "bank_details")!)

                for message in messageArray
                {
                    if let messageDict = message as? NSDictionary
                    {

                        if let data = data {


                            if let bankname = messageDict.value(forKey: "bank_name")
                            {
                                self.bankname.append(bankname as! String)
                                print(bankname)

                            }


                            if let banklogo = messageDict.value(forKey: "logo")
                            {

                                self.bankicon.append(banklogo as! String)
                                print(banklogo)

                            }

                            if let bankid = messageDict.value(forKey: "id")
                            {
                                self.bankid.append(bankid as! Int)
                                print(bankid)

                            }

                            OperationQueue.main.addOperation({
                                self.tableView.reloadData()
                            })

                        }
                    }

                }

            }

        }


    }).resume()

}


func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return (bankname.count)
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! BanksTableViewCell



  cell.bankicon.image = bankicon[indexPath.row] as? UIImage
    cell.bankname.text = bankname[indexPath.row]


    return (cell)

}

}

now When I run this code it is showing blank table cells. I dont know how to get image from url and display the images in table view cell. Please someone help me. this is my whole code to get the all the json data into table view cell. Please someone help me

john Doe
  • 19
  • 5

2 Answers2

0

imageicon[indexPath.row] gives a urlStringand not the instance ofUIImage. You need to fetch the image from server using this urlString.

Use URLSession to fetch the image from server like,

if let url = URL(string: imageicon[indexPath.row]) {
    URLSession.shared.dataTask(with: url) { (data, response, error) in
        if let data = data {
            DispatchQueue.main.async {
                cell.imageicon.image = UIImage(data: data)
            }
        }
    }.resume()
}
PGDev
  • 23,751
  • 6
  • 34
  • 88
-1

Your models should be like this:

/// Your response models
struct BankDetails: Codable {
    let bank_details: [ImageUrl]
}

struct ImageUrl: Codable {
    let logo: String
}

And then in your cell:

class MyCell: UITableViewCell {
    /// create dataTask for cancel in prepareForReuse function
    private var dataTask: URLSessionDataTask?

    /// Like this
    override public func prepareForReuse() {
        super.prepareForReuse()
        dataTask?.cancel()
    }

    func populate(with model: YourModel) {
        /// You should set url in indexPath of your logo array([ImageUrl])
        let url = model.url /// It's sample url for explain this is an url of your current index model
        if let imageUrl = url {
            downloaded(from: imageUrl)
        }
    }

    func downloaded(from url: URL, contentMode mode: UIView.ContentMode = .scaleAspectFit) {
        contentMode = mode
        dataTask = URLSession.shared.dataTask(with: url) { data, response, error in
            guard
                 let httpURLResponse = response as? HTTPURLResponse, httpURLResponse.statusCode == 200,
                 let mimeType = response?.mimeType, mimeType.hasPrefix("image"),
                let data = data, error == nil,
                let image = UIImage(data: data)
                else { return }
            DispatchQueue.main.async() {
                self.yourImageView.image = image
            }
        }
        dataTask?.resume()
    }
}

In your Controller's tableView cellForRowAt function:

let model = models[indexPath.row]
cell.populate(with: model)

return cell

You can use the above models, and create displayFromDb like this:

func displayFromDb() {
    let tokensp = UserDefaults.standard.string(forKey: "tokenKey")
    let url = NSURL(string: BANKS_URL+"?token="+tokensp!)

    if let myUrl = url {
        URLSession.shared.dataTask(with: myUrl) { (data, response , error) in      
        guard let data = data else { return }
        do {
            let decoder = JSONDecoder()
            let data = try decoder.decode(BankDetails.self, from: data)
            print("my logo array is: \(data.bank_details)")
            // TODO: - So you get urls 

        } catch let err {
            print("Err", err)
        }
    }.resume()
    }

}
emrcftci
  • 3,355
  • 3
  • 21
  • 35