我尝试按照alamofire的距离和事件日期对事件进行排序
我是swift的初学者,按距离排序已完成。现在我无法按日期排序。
为此,在我的JSON上,我有这样的信息:
[{
"id": 1,
"name": "",
"eventDate1": "14/02/2018",
"eventDate2": "26/03/2018",
"eventDate3": "01/01/2018",
"eventDate4": "",
"eventDate5": "",
...
这是活动的日期(同时最多5个日期)。我想在活动开始前一周才展示活动。不是在一周之前,而是在事件发生之后。如果已经在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)
}
}
}
有人可以帮我解决这个问题吗?感谢
答案 0 :(得分:0)
这个问题的答案听起来很奇怪,但在这里:最好的办法是忘记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
密钥保持一致是一个好主意,它看起来像一个丑陋的kludge。为什么5个日期的人为限制?好的,可能有UI原因,但这只会影响您的显示,而不是您的数据结构。如果您可以控制服务器响应(并且您似乎能够),那么您应该考虑使用"dates"
- 数组,只包含字符串或可能是另一个字典(例如Swift中的Codable
个对象)以及其他信息(例如,位置,时间等)这将更加灵活,您不必以当前结构中的方式处理选项。
请注意,使用我的简单数据结构不能解析原始结构,因为当前密钥需要有效日期。如果您不希望,您可能需要为它编写自定义初始化程序。