使用转义闭包从 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()
}
我正在尝试按字母顺序对带有自定义单元格的 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()
}