2016-04-09 3 views
1

午前中 私は優れたiOS Apps With REST APIs本の例に従って、AlamofireとSwiftyJSONを使用しています。私が本に触れていないことの一つは、入ってくるjsonオブジェクトを特定の順序に並べ替える方法です。日付。私が下に貼り付けたコードはjsonオブジェクトを引き込むのに問題ありませんが、私が知る限り、created_byによって自動的に順序付けられています。私は野菜で野菜のクラスから始めましょうAlamofireとSwiftyJSONの使用時にJSONをソート

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

:私は別の順序でソートしたいのですが、私のようなもので並べ替えることができるように、私のクラスは野菜と呼ばれ、name属性を持っていたと言うことができます。私JSONSerializerファイル内の迅速

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

私は次のことを持って、私は、各呼び出しでいくつかのより多くの柔軟性を好むように私はここで直接順序を変更したいと思いますかわかりません。

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

最後に、以下の機能を持って、私のテーブルビューを移入私が持っている:私はこれを取得することができます任意の助けに感謝

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

VegetableクラスにNSDateプロパティがありますか? –

+0

ええ、わかりやすくするために私の質問に簡単なクラスを追加しました。 –

答えて

4

NSDateプロパティがあるので、NSDateのcompareメソッドでソートできます。

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

ありがとう、どのファイルを追加するのですか? –

+0

結果をtableViewデータソースに追加してtableViewをリロードする直前に、loadVegetables()メソッドの内部で行います。 –

+0

私は次のエラーが表示されます: '結果<[野菜]、NSError>'(別名Result 、NSError>)にはメンバー 'sortInPlace'がありません。私がresults.valueのsortInPlaceを呼び出そうとすると!私はバリューを得るだけのプロパティです。 –

関連する問題