SwiftyJson 导致 UITableView 顺序错误

Posted

技术标签:

【中文标题】SwiftyJson 导致 UITableView 顺序错误【英文标题】:SwiftyJson Results in UITableView wrong order 【发布时间】:2016-01-31 22:04:43 【问题描述】:

我正在使用 Alamofire 和 SwiftyJson 开发一个简单的 JSON 阅读器应用程序。获取文件并将它们解析到 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()
    

【问题讨论】:

【参考方案1】:

您正在通过遍历字典来填充数组:

for (title, data) in subJson

subJson 是带有分类的字典)

Swift 字典是无序的集合,因此您的数组是“乱序”填充的。

这是按预期工作的。 ;)

如果您无法从源头更改 JSON,则只需 sort() 填充您的数组即可 - 但最好更改类别存储策略,而不是使其依赖于字典键顺序。

要对数组进行排序,您可以执行以下操作:

let sectionsArraySorted = sectionsArray.sort  $0.title < $1.title 
completion(sectionsArraySorted)

但改变 JSON 结构肯定会更好,目前的结构并不适合这项任务。

【讨论】:

这给了我这个错误:“sections”类型的值没有成员“title”:/ 忽略这一点,标题被更改为结构中的标题,使用标题。谢谢。 小心,在 Swift 3 中,未变异的sort 又变成了sorted,变异的是sort

以上是关于SwiftyJson 导致 UITableView 顺序错误的主要内容,如果未能解决你的问题,请参考以下文章

SwiftyJSON 没有重新加载 UITableView

Swift 2 SwiftyJSON API 数据到 UITableView

UITableView 不使用 SwiftyJSON 和 Alamofire 加载数据

从 3.0 更新到 SwiftyJSON 4.0 导致旧代码不明确

使用 SwiftyJSON 解析 JSON

显示 swiftyjson 解析数据的最佳方式?