SwiftyJson 导致 UITableView 顺序错误
SwiftyJson Results in UITableView wrong order
我正在使用 Alamofire 和 SwiftyJson 开发一个简单的 JSON reader 应用程序。获取文件并将它们解析到 UITableView 中工作正常,除了它以错误的结果显示它们。
如何让它们按照 JSON 文件指定的顺序显示?
这是输出:
如您所见,Category3 先显示,然后是 Category1。
我想要它们的顺序是 Json:
{"Posts": [
{
"Category1": [
"Post1",
"Post2",
"Post3",
"Post4",
"Post5",
"Post6",
"Post7"
],
"Category2": [
"Post1",
"Post2",
"Post3",
"Post4",
"Post5",
"Post6",
"Post7",
"Post8"
],
"Category3": [
"Post1",
"Post2"
]
}
]}
查看控制器代码:
func getSectionsFromData(completion: ([Sections]) -> ()) {
var sectionsArray = [Sections]()
Alamofire.request(.GET, url).validate().responseJSON { response in
switch response.result {
case .Success:
if let value = response.result.value {
let json = JSON(value)
for (_, subJson) in json["Posts"] {
for (title, data) in subJson {
let optionalCastedObjects = data.arrayObject as? [String]
let unwrappedObjects = optionalCastedObjects ?? []
let section = Sections(title: title, objects: unwrappedObjects)
sectionsArray.append(section)
}
}
completion(sectionsArray)
}
case .Failure(let error):
print(error)
}
}
}
UITableView 重新加载:
SectionsData().getSectionsFromData { [weak self](sections: [Sections]) -> () in
self?.sections = sections
self?.tableView.reloadData()
self!.activityIndicatorView.stopAnimating()
}
您正在通过遍历字典来填充数组:
for (title, data) in subJson
(subJson
是带有类别的字典)
Swift 字典是无序集合,因此您的数组已填充 "out of order".
这按预期工作。 ;)
如果您不能在源代码处更改 JSON,那么在填充后只需 sort()
您的数组 - 但最好更改类别存储策略而不使其依赖按字典键顺序。
要对数组进行排序,您可以这样做:
let sectionsArraySorted = sectionsArray.sort { [=11=].title < .title }
completion(sectionsArraySorted)
但改变 JSON 结构肯定会更好,目前的结构不适合这项任务。
我正在使用 Alamofire 和 SwiftyJson 开发一个简单的 JSON reader 应用程序。获取文件并将它们解析到 UITableView 中工作正常,除了它以错误的结果显示它们。
如何让它们按照 JSON 文件指定的顺序显示?
这是输出:
如您所见,Category3 先显示,然后是 Category1。
我想要它们的顺序是 Json:
{"Posts": [
{
"Category1": [
"Post1",
"Post2",
"Post3",
"Post4",
"Post5",
"Post6",
"Post7"
],
"Category2": [
"Post1",
"Post2",
"Post3",
"Post4",
"Post5",
"Post6",
"Post7",
"Post8"
],
"Category3": [
"Post1",
"Post2"
]
}
]}
查看控制器代码:
func getSectionsFromData(completion: ([Sections]) -> ()) {
var sectionsArray = [Sections]()
Alamofire.request(.GET, url).validate().responseJSON { response in
switch response.result {
case .Success:
if let value = response.result.value {
let json = JSON(value)
for (_, subJson) in json["Posts"] {
for (title, data) in subJson {
let optionalCastedObjects = data.arrayObject as? [String]
let unwrappedObjects = optionalCastedObjects ?? []
let section = Sections(title: title, objects: unwrappedObjects)
sectionsArray.append(section)
}
}
completion(sectionsArray)
}
case .Failure(let error):
print(error)
}
}
}
UITableView 重新加载:
SectionsData().getSectionsFromData { [weak self](sections: [Sections]) -> () in
self?.sections = sections
self?.tableView.reloadData()
self!.activityIndicatorView.stopAnimating()
}
您正在通过遍历字典来填充数组:
for (title, data) in subJson
(subJson
是带有类别的字典)
Swift 字典是无序集合,因此您的数组已填充 "out of order".
这按预期工作。 ;)
如果您不能在源代码处更改 JSON,那么在填充后只需 sort()
您的数组 - 但最好更改类别存储策略而不使其依赖按字典键顺序。
要对数组进行排序,您可以这样做:
let sectionsArraySorted = sectionsArray.sort { [=11=].title < .title }
completion(sectionsArraySorted)
但改变 JSON 结构肯定会更好,目前的结构不适合这项任务。