json - 请求新的 json 响应时清除数组中的数据( fatal error : Index out of range swift 3)

标签 json swift

我有 json 请求,显示汽车列表。我使用计时器每 10 秒刷新一次请求和列表。问题是数据不断添加到数组中并使我的应用程序崩溃。在添加新数据之前如何清除数据?我应该怎么办?

    let list = listdevices[indexPath.row] // error 

    if list.statusxe == "run" {
        cell?.devnameLabel?.text = list.devname
        cell?.addressLabel?.text = list.address
        cell?.statusxeLabel?.textColor = UIColor(red: 1/255, green: 117/255, blue: 0/255, alpha: 1)
        cell?.statusxeLabel?.text = "Đang chạy"
        cell?.speedLabel?.text = "\(list.speed) km/h"

    }
   else if  list.statusxe == "stop"{
        cell?.devnameLabel?.text = list.devname
        cell?.addressLabel?.text = list.address
        cell?.statusxeLabel?.textColor = UIColor(red: 230/255, green: 6/255, blue: 6/255, alpha: 1)

        cell?.statusxeLabel?.text = "Đang dừng"
        cell?.speedLabel?.text = ""

    }
    else if list.statusxe == "expired"{
        cell?.devnameLabel?.text = list.devname
        cell?.addressLabel?.text = list.address
        cell?.statusxeLabel?.textColor = UIColor.black
        cell?.speedLabel?.textColor = UIColor.black

        cell?.statusxeLabel.text = " "
        cell?.speedLabel?.text = "hết hạn dịch vụ"
    }
    else if list.statusxe == "lost_gprs"{
        cell?.devnameLabel?.text = list.devname
        cell?.addressLabel?.text = list.address
        cell?.statusxeLabel?.textColor = UIColor.red
        cell?.statusxeLabel?.text = "Mất GPRS"
        cell?.speedLabel?.text = ""
    }
    cell?.accessoryType = UITableViewCellAccessoryType.disclosureIndicator

    return cell!
}

我有 json 请求,显示汽车列表。我使用计时器每 10 秒刷新一次请求和列表。问题是数据不断添加到数组中并使我的应用程序崩溃。在添加新数据之前如何清除数据?我该怎么办?

    let url = "http://api.vnetgps.com:8000/tracking"

    var request = URLRequest(url: URL(string: url)!)
    request.httpMethod = "GET"
    request.setValue(token , forHTTPHeaderField: "token")
    request.setValue(username, forHTTPHeaderField: "username")
    request.setValue("-1", forHTTPHeaderField: "devid")
    let configuration = URLSessionConfiguration.default
    let session = URLSession(configuration: configuration, delegate: nil, delegateQueue: OperationQueue.main)

    let task = session.dataTask(with: request, completionHandler: {(data, response, error) in

        if (error != nil ) {
            print("Error")

        }
        else {
            self.listdevices.removeAll()


            if let json = try? JSONSerialization.jsonObject(with: data!, options: []) as? [String: Any],

                let items = json?["units"] as? [[String: Any]] {


                for item in items {

                    var lat = item["latitude"] as? String
                    UserDefaults.standard.set(lat, forKey: "latitude")

                    var long = item["longitude"] as? String
                    UserDefaults.standard.set(long, forKey: "longitude")

                   // print("long", long)
                    var devid = item["devid"] as? String
                    UserDefaults.standard.set(devid, forKey: "devid")
                    var devname = item["devname"] as? String
                    UserDefaults.standard.set(devname, forKey: "devname")

                    var speed = item["speed"] as? String
                    UserDefaults.standard.set(speed, forKey: "speed")

                    var statustt = item["status"] as? String
                    UserDefaults.standard.set(statustt, forKey: "statusxe")
                    var drivername = item["drivername"] as? String
                    UserDefaults.standard.set(drivername, forKey: "drivername")
                    var address = item["address"] as? String
                    UserDefaults.standard.set(address, forKey: "address")
                     var direction = item["direction"] as? String


                    self.listdevices.append(Listdevices(statusxe: statustt! , speed: speed!, devid: devid!, devname: devname!, address: address!, latitude: lat!, longitude: long!, drivername: drivername!, direction: direction!))
                    // print("list",self.listdevices)

                }

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


            }
        }

    })
    task.resume()
}

最佳答案

问题可能是您在 TableView 使用数组时清空了数组。

而是使用 map 将旧数组内容替换为新内容。这样您就不需要先清空数组。

类似于:

self.listDevices = items.map { Listdevices($0) }

然后为 ListDevices 实现一个初始化程序,如下所示:

init(device: [String: Any]) { ... }

一些未经请求的代码审查评论:

  • 对 UserDefaults 的所有写入都是毫无意义的,因为每次迭代都会覆盖前一次迭代,因此您应该删除整个循环。

  • 将 statusxe 设为枚举 StatusXE

  • 用基于新 StatusXE 枚举的开关替换长条件

  • 命名时要小心。变量 list 不是列表,因此不要这样调用它,而可以将其称为 device。变量listdevices应该被称为devices,或者如果你坚持使用单词列表,它应该是deviceList。还要记住正确的驼峰命名法。

  • 避免强行展开。可以使用 nil 合并运算符为 null 的设备属性提供默认值。

  • 避免不必要的重复代码。在长条件语句中,前两行代码在每种情况下都会重复。只需将这两行移出条件即可。

关于json - 请求新的 json 响应时清除数组中的数据( fatal error : Index out of range swift 3),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45994834/

相关文章:

ios - 如何在 Swift 中访问 iOS 私有(private) API?

javascript - canvasjs 柱形图 - json 对象中有 'x' 值,我不知道它来自哪里

php - 以标题行为键的 CSV 到 Json

javascript - 如何查看json对象的格式?

php - 使用 mysqli_query 进行 json 表单验证

swift - 如何在 Swift 中为字符串添加引号?

ios - 将 sender.currentTitle UIButton 文本发送到 PopUpViewController 中的 UILabel 而不是发送到 PopUpViewController

javascript - Fullcalendar 如何从 PHP 加载 BusinessHours

ios - 随机生成的数组仅适用于按钮

ios - 如何覆盖核心数据中的数据?如何解决Core Data中的重复数据?