2

我正在尝试按字母顺序对带有自定义单元格的 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 后如何生成这些部分?那是问题吗?

4

1 回答 1

2

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

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

或在 Swift 3 及更高版本中:

DispatchQueue.main.async {
  self.tableView.reloadData()
}
于 2017-09-12T18:37:05.520 回答