使用转义闭包从 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 { [=11=].titleFirstLetter }
    let uniqueFirstLetters = Array(Set(firstLetters))
    self.sortedFirstLetters = uniqueFirstLetters.sorted()

    self.sections = self.sortedFirstLetters.map { firstLetter in
        return self.names
            .filter { [=11=].titleFirstLetter == firstLetter }
            .sorted { [=11=].titleAD < .titleAD }
    }

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

override func viewDidLoad() {
    super.viewDidLoad()


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

    let firstLetters = self.attendees.map { [=12=].titleFirstLetter }
    let uniqueFirstLetters = Array(Set(firstLetters))
    self.sortedFirstLetters = uniqueFirstLetters.sorted()

    self.sections = self.sortedFirstLetters.map { firstLetter in
        return self.names
            .filter { [=12=].titleFirstLetter == firstLetter }
            .sorted { [=12=].titleAD < .titleAD }
    }

    self.downloadAttendeeData {


    }



}

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

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

确保从主线程调用 tableView.reloadData(),如下所示:

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

或在 Swift 3 及更高版本中:

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