可能导致索引超出范围,并且表格可能无法正确显示,这可能是由于DispatchQueue

问题描述 投票:0回答:1

我已经设置好了,因此每次日期选择器更改时,都会在表视图中显示新数据。我需要几次更改日期,以便表显示某些内容,然后它开始正确更新,但是在我不断收到“索引超出范围错误”之后。我怀疑我没有正确使用DispatchQueue。我的代码有什么问题?

谢谢

var showNumberOfRes: Int = 0

class HomeViewController:  UIViewController, UITableViewDelegate, UITableViewDataSource {


    @IBOutlet weak var tableView: UITableView!

    var restaurants = [Results]()     

    func todaysDate() -> String {

        let date = Date()
        let formatter = DateFormatter()
        formatter.dateFormat = "yyyy-MM-dd"
        let result = formatter.string(from: date)

        return result
    }

    @IBAction func datePicker(_ sender: UIDatePicker) {
        selectedDate = sender.date

    }

    var selectedDate : Date = Date() {
           didSet {
               let dateFormatter = DateFormatter()
               dateFormatter.locale = Locale(identifier: "es_ES_POSIX")
               dateFormatter.dateFormat = "yyyy-MM-dd"

             returnJson()

           }
       }

    func returnJson(){

        DispatchQueue.global(qos: .userInitiated).async {

            let formatter = DateFormatter()
           formatter.dateFormat = "yyyy-MM-dd"
            let dateSelected = formatter.string(from: self.selectedDate)

           let parameters = "{\n\t\"locale\": \”mainplace\”,\n\t\”date\": \"\(dateSelected)\",\n\t\"access_token\": \"\(token)\"\n}"
           let postData = parameters.data(using: .utf8)

           var request = URLRequest(url: URL(string: "https://somelink:18999/salesAPI/localeSales")!,timeoutInterval: Double.infinity)
           request.addValue("application/json", forHTTPHeaderField: "Content-Type")

           request.httpMethod = "POST"
           request.httpBody = postData

           let task = URLSession.shared.dataTask(with: request) { data, response, error in
               guard let data = data else {
                   print(String(describing: error))
                   return
               }
               print(String(data: data, encoding: .utf8)!)

               let decoder = JSONDecoder()

               if let jsonPetitions = try? decoder.decode(RootRequest.self, from: data) {
                   self.restaurants = jsonPetitions.results
                   showNumberOfRes = self.restaurants.count
                   print (" \(self.restaurants.count) got it from Json")

               }
               else {print("Nothing!!")}

        }

            task.resume()

          DispatchQueue.main.async {
                self.tableView.reloadData()

            }

        }
    } // End Json

    func loadData() {
          tableView.reloadData()

        let defaults = UserDefaults.standard
         userNameData = defaults.string(forKey: "userNameData")!
         passwordData = defaults.string(forKey: "passwordData")!
         token = defaults.string(forKey: "enterKey")!

        returnJson()

               }

    override func viewDidLoad() {
        super.viewDidLoad()

         self.tableView.dataSource = self
         self.tableView.delegate = self

       returnJson()

    } // End of viewDidLoad

    // Starts Tables
    func numberOfSections(in tableView: UITableView) -> Int { return 1 }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        print("\(showNumberOfRes) printed in the table")
        return showNumberOfRes

    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "MyCell", for: indexPath) as! CustomTableViewCell

            let displayNames = restaurants[indexPath.row]

             cell.locales.text = displayNames.locale

             return cell

    }

    func tableView(_ tableView: UITableView,
                   heightForRowAt indexPath: IndexPath) -> CGFloat {

        return CGFloat(80)

    }  // End Tables


}
swift tableview swift5
1个回答
0
投票

您必须重新加载表视图inside数据任务的完成处理程序。

其他两项更改:

  1. URLSession生成自己的背景队列时,背景队列是多余的>>
  2. 从不try?行中的JSONDecoder。捕获error并打印

  3. func returnJson() {
    
       let formatter = DateFormatter()
       formatter.dateFormat = "yyyy-MM-dd"
       let dateSelected = formatter.string(from: self.selectedDate)
    
       let parameters = "{\n\t\"locale\": \”mainplace\”,\n\t\”date\": \"\(dateSelected)\",\n\t\"access_token\": \"\(token)\"\n}"
       let postData = parameters.data(using: .utf8)
    
       var request = URLRequest(url: URL(string: "https://somelink:18999/salesAPI/localeSales")!,timeoutInterval: Double.infinity)
       request.addValue("application/json", forHTTPHeaderField: "Content-Type")
    
       request.httpMethod = "POST"
       request.httpBody = postData
    
       let task = URLSession.shared.dataTask(with: request) { data, response, error in
           guard let data = data else {
               print(error!)
               return
           }
           print(String(data: data, encoding: .utf8)!)
    
           let decoder = JSONDecoder()
    
           do {
               let jsonPetitions = try decoder.decode(RootRequest.self, from: data) 
               self.restaurants = jsonPetitions.results
               showNumberOfRes = self.restaurants.count
               print (" \(self.restaurants.count) got it from Json")
               DispatchQueue.main.async {
                   self.tableView.reloadData()
               }
    
           } catch {
               print(error)
           }
       }
       task.resume()
    
    } // End Json
    
© www.soinside.com 2019 - 2024. All rights reserved.