1
\$\begingroup\$

I'm trying to show data in UITablleView after getting it from an HTTP request. I heard that the best and professional way to do it is configure the cell and do the call request in model class then send it to the view controller.

Here is what I tried to do, but I think it's not going well. I know this is a wrong way but I wanted to show you what I got based on someone.

UITable View Cell

@IBOutlet weak var status : UILabel!
@IBOutlet weak var date : UILabel!
@IBOutlet weak var model : UILabel!
 func ConfigCell (car : Car){ 
 let urlstr = "http://localhost:8000/api/newuser/check"
 let url = URL(string: urlstr)
 guard let token = UserDataSingleton.sharedDataContainer.token else { return }
 let headers = ["Authorization":"Bearer \(token)"]
 var statusCode: Int = 0
request(url! , method: .get, encoding: JSONEncoding.prettyPrinted , headers: headers )
 .responseJSON { response in
 if let value: AnyObject = response.result.value as AnyObject? {
 //Handle the results as JSON
 let json = JSON(value) 
 for (key, subJson) in json["allcar"] {
 if let status = subJson["status"].string {
 self.status.text = status
 if let date = subJson["created_at"].string {
 self.date.text = date
 if let model = subJson["model"].string {
 self.model.text = model
 let Status = [
 Car(model: model, status: status, date: date)]

Car model

 class Car {
private var _mode : String?
private var _status : String?
private var _date : String?
var model : String{
return _model!
 }
 var status : String {
 return _status!
 }
 var date : String {
 return _date!
 } 
init(model : String , status :String,date : String) {
 self._status = status
 self._model = model
 self._date = date
 } 

Controller

class testViewController: UIViewController, UITableViewDelegate , UITableViewDataSource {
 let data = [Car]()
 @IBOutlet weak var tableview: UITableView!
 override func viewDidLoad() {
 tableview.delegate = self
 tableview.dataSource = self
 print(data.count)
 }
 func numberOfSections(in tableView: UITableView) -> Int {
 return 1
 }
 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
 return data.count
 }
 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
 let cell = tableView.dequeueReusableCell(withIdentifier: "CarCell",for: indexPath) as! CarC
 let entry = data[indexPath.row]
 cell.date.text = entry.date
 cell.model.text = entry.model
 cell.status.text = entry.status
 return cell
Jamal
35.2k13 gold badges134 silver badges238 bronze badges
asked Dec 15, 2016 at 2:43
\$\endgroup\$

1 Answer 1

2
\$\begingroup\$

There are lot of ways to organize an architecture. I will explain how do I understand some of them. Read about MVC and MVVC patterns.

  1. First of all, it would be better do divide all code related to requests and code responsible for UI.
  2. Creating a model class is a good way. Model can only keep and parse data. It shouldn't contain any business logic.
  3. You can create one more type class. Such as presenter or viewModel. This class would manage all contains in this module. Contains the cars array in your case. And here you can ask the ServerInteractor class to run the requests.
  4. All code related to requests would be better to keep in ServerInteractor (or LocalInteractor).
  5. It is a good practice to write methods smaller if it is possible. For example in your cellForRowAt method you can divide all code such as "cell.date.text = entry.date" to the separate method

I wish it would be useful )

answered Dec 15, 2016 at 6:41
\$\endgroup\$

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

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.