使用 Alamofire 和 SwiftyJSON 时排序 JSON

Sorting JSON when using Alamofire and SwiftyJSON

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

.sort { [=11=].name < .name }

我将从 Vegetable.swift

中的蔬菜 class 开始
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 属性,你可以用 NSDate 的 compare 方法排序。

let sorted = result.value.sort { [=10=].date.compare(.date) == .OrderedAscending }