2016-04-09 6 views
1

Утро все, Я слежу за примерами в отличной книге iOS Apps With REST APIs и, как результат, используя Alamofire и SwiftyJSON. Одна вещь, которую я не вижу в книге, заключается в том, как сортировать входящие объекты json в определенном порядке, например. Дата. Код, который я вложил ниже, отлично работает для того, чтобы потянуть json-объекты, но насколько я могу судить, они автоматически упорядочиваются созданным_by. Я хотел бы сортировать другом порядке, позволяет сказать, что мой класс был назван Растительные и имел имя атрибута, так что я мог сортировать что-то вроде:Сортировка JSON при использовании Alamofire и SwiftyJSON

.sort { $0.name < $1.name } 

Начну с классом овощей в овоще. скор

class Vegetable: ResponseJSONObjectSerializable { 
    var id: Int? 
    var name : String? 
    var date: NSDate? 
} 

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

public func responseArray<T: ResponseJSONObjectSerializable>(completionHandler: Response<[T], NSError> -> Void) -> Self { 
    let serializer = ResponseSerializer<[T], NSError> { request, response, data, error in 
     guard error == nil else { 
      return .Failure(error!) 
     } 
     guard let responseData = data else { 
      let failureReason = "Array could not be serialized because input data was nil." 
      let error = Error.errorWithCode(.DataSerializationFailed, failureReason: failureReason) 
      return .Failure(error) 
     } 

     let JSONResponseSerializer = Request.JSONResponseSerializer(options: .AllowFragments) 
     let result = JSONResponseSerializer.serializeResponse(request, response, responseData, error) 

     switch result { 
     case .Success(let value): 
      let json = SwiftyJSON.JSON(value) 

      var objects: [T] = [] 
      for (_, item) in json { 
       if let object = T(json: item) { 
        objects.append(object) 
       } 
      } 
      return .Success(objects) 
     case .Failure(let error): 
      return .Failure(error) 
     } 
    } 

    return response(responseSerializer: serializer, completionHandler: completionHandler) 
} 

Тогда в моем APIManager У меня есть следующие функции

func getAllVegetables(completionHandler: (Result<[Vegetable], NSError>) -> Void) { 
    Alamofire.request(VegetableRouter.GetVegetables()) 
     .responseArray { (response:Response<[Vegetable], NSError>) in 
      completionHandler(response.result) 
    } 
} 

Наконец, заполнить мою TableView у меня есть:

func loadVegetables() { 
    self.isLoading = true 
    VegetablesAPIManager.sharedInstance.getAllVegetables() { 
     result in 
     self.isLoading = false 
     if self.refreshControl.refreshing { 
      self.refreshControl.endRefreshing() 
     } 

     guard result.error == nil else { 
      print(result.error) 
      // TODO: Display Error 
      return 
     } 
     if let fetchedVegetables = result.value { 
      self.vegetables = fetchedVegetables 
      for vegetable in fetchedVegetables { 
       // Nothing here at the moment 
      } 
     } 

     self.tableView.reloadData() 
    } 

} 

Я признателен за любую помощь, которую я могу получить с этим, спасибо !

+0

У вас есть свойство NSDate в вашем классе Овощной? –

+0

Да, я просто добавил простой класс к моему вопросу для ясности. –

ответ

4

Поскольку у вас есть свойство NSDate, вы можете сортировать его с помощью метода compare NSDate.

let sorted = result.value.sort { $0.date.compare($1.date) == .OrderedAscending } 
+0

Спасибо, Какой файл я бы хотел добавить? –

+0

Внутри метода loadVegetables(), перед добавлением результата в источник данных tableView и перезагрузкой tableView. –

+0

Когда я пытаюсь это сделать, я получаю следующую ошибку: Значение типа «Результат <[Vegetable], NSError> '(aka' Результат , NSError> ') не имеет имени пользователя sortInPlace'. и если я попытаюсь вызвать sortInPlace на results.value! Я получаю Value - свойство get-only. –