SwiftyJson导致UITableView错误的顺序

时间:2016-01-31 22:04:44

标签: ios swift uitableview swifty-json

我正在使用Alamofire和SwiftyJson开发一个简单的JSON阅读器应用程序。获取文件并将它们解析到UITableView中工作正常,除非它显示错误的结果。

如何让它们按照JSON文件指定的顺序显示?

这是输出: enter image description here

如您所见,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 Reload:

SectionsData().getSectionsFromData { [weak self](sections: [Sections]) -> () in
        self?.sections = sections
        self?.tableView.reloadData()
        self!.activityIndicatorView.stopAnimating()
    }

1 个答案:

答案 0 :(得分:3)

您正在通过字典循环填充数组:

for (title, data) in subJson

subJson是包含类别的词典)

Swift Dictionaries是无序集合,因此您的数组将“无序”填充。

这是按预期工作的。 ;)

如果你不能在源头上更改JSON,那么只要你的数组填充了sort() - 但最好更改类别存储策略而不是依赖于字典键顺序。< / p>

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

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

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