首页 > 解决方案 > 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)
        }
    }

}

有人可以帮助我如何做到这一点?谢谢

标签: iosswiftalamofire

解决方案


这个问题的答案听起来很奇怪,但它是这样的:你最好的选择是忘记responseJSONresponseString而是使用并运行你自己的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"仅包含字符串或另一个字典(例如CodableSwift 中的对象)的 -array 以及其他信息(例如位置、时间等)。这将更加灵活,您不必像在当前结构中那样处理选项。

请注意,使用我的简单数据结构将无法解析您的原始结构,因为当前键将需要有效日期。如果您愿意,您可能必须为它编写一个自定义初始化程序。


推荐阅读