使用 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 }
大家早上好, 我一直在关注优秀的 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 }