Групповой массив для представления разделов в UITableView в Swift - PullRequest
0 голосов
/ 15 января 2020

У меня есть следующий класс:

ChatMessage: Codable {
    var id: Int?
    var sender: User?
    var message: String?
    var seen: Int?
    var tsp: Date?
}

TSP отформатирован так: YYYY-MM-DD hh:mm:ss

Я бы хотел "сгруппировать" сообщения, отправленные в тот же день, чтобы закончить с чем-то вроде этого:

let groupedMessages = [ [ChatMessage, ChatMessage], [ChatMessage, ChatMessage, ChatMessage] ]

В конечном итоге я хочу использовать groupedMessages в UITableViewController для введения таких разделов:

func numberOfSections(in tableView: UITableView) -> Int {
        return groupedMessages.count 
        // would be 2 int the above
    }



    func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        return chatMessages[section].count 
        // would be 2 for the first and 3 for the second section
    }

Какой самый эффективный способ получить сортировка выполнена? то есть то, что также хорошо работает, когда количество сортируемых chatMessages увеличивается

Ответы [ 4 ]

0 голосов
/ 15 января 2020
let testArray = ["2016-06-23 09:07:21", "2016-06-23 08:07:21", "2016-06-22 09:07:21", "2016-06-22 08:07:21"]

        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "YYYY-MM-DD hh:mm:ss"

        let groupDic = Dictionary(grouping: testArray) { (pendingCamera) -> DateComponents in

            let date = Calendar.current.dateComponents([.day, .year, .month], from: dateFormatter.date(from: pendingCamera)!)

            return date
        }
        print(groupDic)

Вы можете взять groupDi c и вернуть число numberOfSections и titleForHeaderInSection.

0 голосов
/ 15 января 2020

Вы можете попробовать:

let cal = Calendar.current
let groupedMessages = Dictionary(grouping: self.chatMessages, by: { cal.startOfDay($0.tsp) })
let keys = groupedMessages.keys.sorted(by: { $0 > $1 })

Это, однако, даст вам словарь вроде:

[
  SomeDateHere: [
    ChatMessage(id: 0, sender: User?, message: "String", seen: 1),
    ChatMessage(id: 0, sender: User?, message: "String", seen: 1)
  ],
  AnotherDateHere: [
    ChatMessage(id: 0, sender: User?, message: "String", seen: 1)
]

Затем вы можете использовать ключи, чтобы вернуть счетчик разделов:

return keys.count

И получить массив сообщений для каждого элемента словаря, например, так:

let key = keys[indexPath.section]
let messages = groupedMessages[key].sorted(by: { $0.tsp > $1.tsp })

Или получить только счет:

let key = keys[indexPath.section]
return groupedMessages[key].count
0 голосов
/ 15 января 2020

Я бы, вероятно, начал с введения нового типа:

public struct CalendarDay: Hashable {
   public let date: Date

   public init(date: Date = Date()) {
       self.date = Calendar.current.startOfDay(for: date)
   }
}

extension CalendarDay: Comparable {
   public static func < (lhs: CalendarDay, rhs: CalendarDay) -> Bool {
      return lhs.date < rhs.date
   }
}

Затем я бы расширил ваше сообщение:

extension ChatMessage {
    var day: CalendarDay {
       return CalendarDay(date: tsp)
    }
}

(я предполагаю, что tsp не является обязательным, нет причин для его необязательности).

Теперь давайте определим раздел:

struct Section {
   var messages: [ChatMessage] = []
   let day: CalendarDay

   init(day: CalendarDay) {
      self.day = day
   }
}

Давайте сгруппируемся легко:

let messages: [ChatMessage] = ...
var sections: [CalendarDay: Section] = [:]

for message in messages {
   let day = message.day
   var section = sections[day] ?? Section(day: day)
   section.messages.append(day)
   sections[day] = section
}

let sectionList = Array(sections.values).sorted { $0.day < $1.day }

Если ваши сообщения изначально не отсортированы, возможно, вам придется сортировать сообщения в каждом разделе отдельно.

0 голосов
/ 15 января 2020

Группировка массива по дате вы можете найти здесь Как сгруппировать массив объектов по дате в swift?

Как подключить это к UITableView вы найдете здесь https://www.ralfebert.de/ios-examples/uikit/uitableviewcontroller/grouping-sections/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...