使用 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