Alamofire按日期排序

时间:2018-05-16 15:18:49

标签: ios swift alamofire

我尝试按照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)
        }
    }

}

有人可以帮我解决这个问题吗?感谢

1 个答案:

答案 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个对象)以及其他信息(例如,位置,时间等)这将更加灵活,您不必以当前结构中的方式处理选项。

请注意,使用我的简单数据结构不能解析原始结构,因为当前密钥需要有效日期。如果您不希望,您可能需要为它编写自定义初始化程序。