使用 Alamofire 和 SwiftyJSON 时对 JSON 进行排序

Posted

技术标签:

【中文标题】使用 Alamofire 和 SwiftyJSON 时对 JSON 进行排序【英文标题】:Sorting JSON when using Alamofire and SwiftyJSON 【发布时间】:2016-04-09 12:03:22 【问题描述】:

大家早上好, 我一直在关注优秀的 ios Apps With REST APIs 书中的示例,因此使用了 Alamofire 和 SwiftyJSON。我在书中没有提到的一件事是如何将传入的 json 对象排序为特定的顺序,例如。日期。我在下面粘贴的代码可以很好地提取 json 对象,但据我所知,它们是由 created_by 自动排序的。我想按不同的顺序排序,假设我的班级被称为蔬菜并且有一个名称属性,以便我可以按如下排序:

.sort  $0.name < $1.name 

我将从 Vegetable.swift 中的蔬菜类开始

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)
    

最后,填充我的表格视图:

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


感谢您对此提供的任何帮助,谢谢!

【问题讨论】:

蔬菜类中有 NSDate 属性吗? 是的,为了清楚起见,我只是在我的问题中添加了一个简单的类。 【参考方案1】:

由于你有一个 NSDate 属性,你可以使用 NSDate 的compare 方法进行排序。

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

【讨论】:

谢谢,我要添加哪个文件? 在 loadVegetables() 方法中,在将结果添加到 tableView 数据源并重新加载 tableView 之前。 当我尝试得到以下错误:'Result' 类型的值(又名'Result, NSError>')没有成员'sortInPlace '。如果我尝试在 results.value 上调用 sortInPlace!我得到 Value 是 get-only 属性。 啊,我明白了,所以在 loadVegetables() 中我做了 self.vegetables.sortInPlace $0.date!.compare($1.date!) == .OrderedDescending 并且它有效!非常感谢您的帮助,我会将其标记为已回答。

以上是关于使用 Alamofire 和 SwiftyJSON 时对 JSON 进行排序的主要内容,如果未能解决你的问题,请参考以下文章

SwiftyJson 和 Alamofire 使用的解码结构

如何使用 Alamofire 和 SwiftyJSON 正确解析 JSON

如何将 RxSwift 与 AlamoFire 和 SwiftyJSON 一起使用?

无法使用“((Any))”类型的参数列表调用“JSON” - 使用 AlamoFire 和 SwiftyJSON

使用 Alamofire 和 SwiftyJSON 时对 JSON 进行排序

使用 SwiftyJSON(和 Alamofire)解析 JSON 值