2016-04-09 19 views
1

Sabahın tamamı, Mükemmel iOS Apps With REST APIs kitabındaki örneklerde izledim ve sonuç olarak Alamofire ve SwiftyJSON kullanarak. Kitapta bahsettiğim bir şey, gelen json nesnelerini belirli bir sıraya göre nasıl sıralayacağınızdır. tarihi. Aşağıda yaptığım kod json nesnelerini çekmek için gayet güzel çalışıyor, ancak söyleyebildiğim kadarıyla, bunlar otomatik olarak created_by tarafından sipariş ediliyor. Ben Sebze Sebze sınıfı ile başlayacağızAlamofire ve SwiftyJSON kullanırken JSON Sıralama

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

: Ben farklı bir sıraya göre sıralamak istiyorum, ben böyle bir şey göre sıralamak diye benim sınıf Sebze denilen ve bir isim özelliği vardı diyelim. Ben şu var benim JSONSerializer dosyası içinde

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

hızlı, ben her çağrı ile biraz daha esneklik tercih ediyorum burada doğrudan sırasını değiştirmek isteyen emin değilim.

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) 
} 

Sonra benim APIManager I

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

Son olarak aşağıdaki işlevi var benim tableView doldurmak Ben: Ben bu ile olsun herhangi bir yardım takdir

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() 
    } 

} 

, teşekkürler !

+0

Vegetable sınıfınızda NSDate özelliğiniz var mı? –

+0

Evet, açıklığa kavuşturmak için soruma basit bir sınıf ekledim. –

cevap

4

NSDate özelliğiniz olduğundan, NSDate öğesinin compare yöntemiyle sıralayabilirsiniz.

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

Teşekkürler, Hangi dosyayı eklemek isterdim? –

+0

loadVegetables() yönteminde, sonucu tablonuza eklemeden hemen önce veri kaynağını görüntüleyin ve tablonuzu yeniden yükleyin. –

+0

Bunu denediğimde, aşağıdaki hatayı alıyorum: 'Sonucu <[Vegetable], NSError>' (aka 'Sonuç , NSError>') öğesinin değeri 'sortInPlace' öğesinin üyesi değil. ve eğer results.value üzerinde sortInPlace'i çağırmaya çalışırsam! Değer get-get özelliği var. –