我有 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/