Сортировка по дате - PullRequest
       9

Сортировка по дате

0 голосов
/ 16 мая 2018

Я пытаюсь сделать и приложения, которые сортируют события 1-го по расстоянию и по дате события с alamofire

Я начинающий с быстрой и сортировки по расстоянию сделано. Теперь я не могу отсортировать по дате.

для этого, на моем JSON, у меня есть такая информация:

[{
    "id": 1,
    "name": "",    
    "eventDate1": "14/02/2018",
    "eventDate2": "26/03/2018",
    "eventDate3": "01/01/2018",
    "eventDate4": "",
    "eventDate5": "",
    ...

это дата события (максимум 5 дат одновременно). Я хотел бы показать событие только за 1 неделю до даты мероприятия. Не раньше, чем через неделю и не позднее даты мероприятия. Везде, если информация уже добавлена ​​в JSON.

Мой код в табличном представлении на данный момент это:

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 голосов
/ 16 мая 2018

Ответ на этот мой странный звук звучит странно, но здесь он звучит так: вам лучше всего забыть о responseJSON, вместо этого использовать responseString и запустить свой собственный объект протокола Codable. Последнее можно продемонстрировать на детской площадке следующим образом:

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 дат? Хорошо, для этого могут быть причины пользовательского интерфейса, но это должно влиять только на ваш дисплей, а не на структуру данных. Если вы можете контролировать отклик своего сервера (и, похоже, можете), вам следует рассмотреть возможность использования массива "dates", содержащего только строки или, возможно, другой словарь (например, Codable объект в Swift) с дополнительной информацией (например, местоположение, время и т. д.) Это будет более гибко, и вам не придется иметь дело с опционами так же, как в текущей структуре.

Обратите внимание, что ваша исходная структура не может быть проанализирована с использованием моей простой структуры данных, поскольку для существующего ключа потребуется действительная дата. Если вы хотите иначе, вам, вероятно, придется написать собственный инициализатор для него.

...