Хранение данных в Реалм
По нажатию кнопки я сохраняю дату в Реалм, потом достаю оттуда массив дат и сортирую в двумерный массив, который показываю в табличном представлении. При удалении данных с Реалма я иногда теряю какую-нибудь дату, и только при полном удалении дат она появляется в секции. Также если я добавляю к примеру сначала дату в декабре, а потом дату в январе того же года, то дата в январе не добавляется. Думаю у меня проблема в функции sorted()
ViewController:
class ViewController: UIViewController {
@IBOutlet weak var tableView: UITableView!
@IBOutlet weak var datePicker: UIDatePicker!
@IBOutlet weak var createButton: UIButton!
var datesFromRealm: [Date] = []
var sortedDatesByMonth: [[Date]] = []
override func viewDidLoad() {
super.viewDidLoad()
tableView.delegate = self
tableView.dataSource = self
self.tableView.register(UINib(nibName: "TableViewCell", bundle: nil), forCellReuseIdentifier: "TableViewCell")
sorted()
}
func sorted() {
if !sortedDatesByMonth.isEmpty { sortedDatesByMonth.removeAll() }
for i in Persistance.shared.getItems() {
datesFromRealm.append(i.date!)
}
let sortedDateArr = datesFromRealm.sorted { $0.compare($1) == .orderedDescending }
if !datesFromRealm.isEmpty {
var tempMonth = sortedDateArr[0].month
var tempYear = sortedDateArr[0].year
var dates: [Date] = []
for i in 0..<sortedDateArr.count {
if tempMonth == sortedDateArr[i].month && tempYear == sortedDateArr[i].year {
dates.append(sortedDateArr[i])
if i == sortedDateArr.count - 1 {
sortedDatesByMonth.append(dates)
}
} else {
sortedDatesByMonth.append(dates)
dates.removeAll()
dates.append(sortedDateArr[i])
tempMonth = sortedDateArr[i].month
tempYear = sortedDateArr[i].year
}
}
}
datesFromRealm = []
tableView.reloadData()
}
@IBAction func createButtonAction(_ sender: Any) {
let item = Data()
item.date = datePicker.date
Persistance.shared.save(item: item)
sorted()
tableView.reloadData()
}
}
extension ViewController: UITableViewDelegate, UITableViewDataSource {
func numberOfSections(in tableView: UITableView) -> Int {
return sortedDatesByMonth.count
}
func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return "\(sortedDatesByMonth[section][0].prettyMonth)"
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return sortedDatesByMonth[section].count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "TableViewCell") as! TableViewCell
let item = sortedDatesByMonth[indexPath.section][indexPath.item]
cell.labelCell.text = "\(item.prettyDay)"
return cell
}
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
let item = sortedDatesByMonth[indexPath.section][indexPath.row]
for i in Persistance.shared.getItems() {
if i.date == item {
Persistance.shared.remove(item: i)
sorted()
}
}
tableView.reloadData()
}
}
extension Date {
var month: Int {
return Calendar.current.component(.month, from: self)
}
var year: Int {
return Calendar.current.component(.year, from: self)
}
var prettyMonth: String {
let formatter = DateFormatter()
formatter.dateFormat = "MMMM yyyy"
return formatter.string(from: self)
}
var prettyDay: String {
let formatter = DateFormatter()
formatter.locale = Locale(identifier: "ru_RU")
formatter.dateFormat = "dd MMMM yyyy г."
return formatter.string(from: self)
}
}
Realm:
class Data: Object {
@objc dynamic var date: Date?
}
class Persistance {
static let shared = Persistance()
private let realm = try! Realm()
func save(item: Data) {
try! realm.write{
realm.add(item)
}
}
func getItems() -> Results<Data> {
realm.objects(Data.self)
}
func remove(item: Data) {
try! realm.write {
realm.delete(item)
}
}
}