繁体   English   中英

使用转义闭包对来自 AlamoFire 的 UITableViewData 进行排序

[英]Sorting UITableViewData from AlamoFire with an escaping closure

我正在尝试按字母顺序对带有自定义单元格的 UTableView 进行排序和分区。 在我的 ViewController 中,我有一个函数可以下载 JSON 数据,然后将其存储在字典中。

var attendees = [Attendee]()
var sortedFirstLetters: [String] = []
var sections: [[Attendee]] = [[]]

func downloadAttendeeData(completed: @escaping DownloadComplete) {
    let headers: HTTPHeaders = [

        "Accept": "application/json;odata=verbose",
        "User-Agent": "iOS;iOS"

    ]

    NetworkManager.sharedInstance.manager.request(Attendee_URL, method: .get, headers: headers)
        .responseJSON { response in

            let result = response.result

            if let dict = result.value as? Dictionary<String, AnyObject> {

                if let list = dict["d"]?["results"] as? [Dictionary<String, AnyObject>] {

                    for att in list {
                        let attendee = Attendee(AttendeeDict: att)
                        self.attendees.append(attendee)

                    }


                    self.tableView.reloadData()

                }

            }

            completed()
    }


}

这段代码正是我需要的

    let firstLetters = self.attendees.map { $0.titleFirstLetter }
    let uniqueFirstLetters = Array(Set(firstLetters))
    self.sortedFirstLetters = uniqueFirstLetters.sorted()

    self.sections = self.sortedFirstLetters.map { firstLetter in
        return self.names
            .filter { $0.titleFirstLetter == firstLetter }
            .sorted { $0.titleAD < $1.titleAD }
    }

但是,当我将此代码放入 viewDidLoad 时,它会生成空数组。

override func viewDidLoad() {
    super.viewDidLoad()


    tableView.delegate = self
    tableView.dataSource = self
    searchBar.delegate = self

    let firstLetters = self.attendees.map { $0.titleFirstLetter }
    let uniqueFirstLetters = Array(Set(firstLetters))
    self.sortedFirstLetters = uniqueFirstLetters.sorted()

    self.sections = self.sortedFirstLetters.map { firstLetter in
        return self.names
            .filter { $0.titleFirstLetter == firstLetter }
            .sorted { $0.titleAD < $1.titleAD }
    }

    self.downloadAttendeeData {


    }



}

如果我将代码放在 self.downloadAttendeeData 声明中,它会生成数据,但不会创建表部分。

将数据加载到 tableView 后如何生成部分? 这是问题吗?

确保您像这样从主线程调用tableView.reloadData()

dispatch_async(dispatch_get_main_queue()) { 
   self.tableView.reloadData()
}

或在 Swift 3 及更高版本中:

DispatchQueue.main.async {
  self.tableView.reloadData()
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM