ios - Alamofire 按日期排序
问题描述
我尝试使用 alamofire 按距离和事件日期对事件进行排序的应用程序
我是 swift 的初学者,按距离排序就完成了。现在我无法按日期排序。
为此,在我的 JSON 上,我有这样的信息:
[{
"id": 1,
"name": "",
"eventDate1": "14/02/2018",
"eventDate2": "26/03/2018",
"eventDate3": "01/01/2018",
"eventDate4": "",
"eventDate5": "",
...
这是活动的日期(最多同时有 5 个日期)。我想仅在活动日期前 1 周展示活动。不是在一周之前,也不是在活动日期之后。如果信息已添加到 JSON 中,则在任何位置。
我在 tableview 中的代码目前是这样的:
override func viewDidLoad() {
super.viewDidLoad()
//géolocalisation
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.requestWhenInUseAuthorization()
locationManager.startUpdatingLocation()
// Do any additional setup after loading the view, typically from a nib.
Alamofire.request("http://.../event2.json")
.validate()
.responseJSON { (response) in
if response.result.isSuccess {
let rawPersonList = response.result.value as! [[String:AnyObject]]
for personData in rawPersonList {
if let personObject = Person(fromData: personData) {
self._personList.append(personObject)
}
}
if let currentPosition = self.positionUser{
self._personList.sort(by: { (person1, person2) -> Bool in
let distancePerson1FromUser = currentPosition.distance(from: person1.location)
let distancePerson2FromUser = currentPosition.distance(from: person2.location)
return distancePerson1FromUser < distancePerson2FromUser
})
}
self.tableView.reloadData()
} else {
print(response.result.error as Any)
}
}
}
有人可以帮助我如何做到这一点?谢谢
解决方案
这个问题的答案听起来很奇怪,但它是这样的:你最好的选择是忘记responseJSON
,responseString
而是使用并运行你自己的Codable
协议对象。后者可以在 Playground 中演示,如下所示:
import Cocoa
let jsonData = """
[{
"id": 1,
"name": "",
"eventDate1": "14/02/2018",
"eventDate2": "26/03/2018",
"eventDate3": "01/01/2018"
}]
""".data(using: .utf8)!
struct SpecialEvent: Codable {
let id: Int
let name: String
let eventDate1 : Date
let eventDate2 : Date?
let eventDate3 : Date?
let eventDate4 : Date?
let eventDate5 : Date?
}
let formatter = DateFormatter()
formatter.dateFormat = "dd/mm/yyyy"
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .formatted(formatter)
do {
let evt = try decoder.decode([SpecialEvent].self, from: jsonData)
print(evt)
} catch {
print(error)
}
这大大简化了您的解析,非常接近JSON
您提出的 - 结构。但是我不确定保留你的eventDate
钥匙是否是个好主意,它看起来像一个丑陋的杂物。为什么人为限制 5 个日期?好的,可能有 UI 原因,但这应该只会影响您的显示,而不是您的数据结构。如果您可以控制您的服务器响应(并且您似乎能够),您应该考虑使用一个"dates"
仅包含字符串或另一个字典(例如Codable
Swift 中的对象)的 -array 以及其他信息(例如位置、时间等)。这将更加灵活,您不必像在当前结构中那样处理选项。
请注意,使用我的简单数据结构将无法解析您的原始结构,因为当前键将需要有效日期。如果您愿意,您可能必须为它编写一个自定义初始化程序。
推荐阅读
- c# - 如何在 TextBox 中只注册数字?(我没有 KeyPress 事件)
- c# - 已经在数组中时重复数组中的对象的问题
- angular - Ionic Cordova 添加原生 Firebase:缺少命令错误
- html - 为什么css在同一个div中以两种不同的方式定义我的文本?
- java - 我在 listView 中有一个倒数计时器,但工作不正常
- javascript - ajax post opens a window with blanked url
- django - 升级到 Django 2.2:AttributeError:模块 'statistics' 没有属性 'pstdev'
- postman - 为什么在我的期望函数中只有一个引号?
- python - 如何从 .txt 文件中的表创建矩阵
- excel - 过滤数据时冻结行/列