Уведомления областей об изменениях дочерних объектов - PullRequest
0 голосов
/ 12 марта 2020

У меня есть список Entry предметов, и у каждого из них есть связанные задачи. Эти записи заполняются в UITableView следующим образом:

enter image description here

Синяя таблетка (?) показывает количество задач для каждой записи. Вот мои определения классов в Realm:

class Entry: NSObject{
  @objc dynamic var name = ""
  ...
}
class Task: NSObject{
  @objc dynamic var entry: Entry?
  ...
}

Моя цель - следить за уведомлениями Realm, чтобы обновлять счет задач для каждой записи без перезагрузки всего UITableView. В настоящее время я делаю это, помещая прослушиватель уведомлений Realm на каждый UITableViewCell, например:

//---------- UITableView delegate ----------
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  let entry = entries[indexPath.row]
  let cell = tableView.dequeueReusableCell(withIdentifier: "EntryCell", for: indexPath) as! EntryCell

  cell.label.text = entry.name

  //Task count
  cell.entry = entry
  cell.setupRealmListener()

  return cell    
}

//---------- Table Cell Definition ----------
class EntryCell: UITableViewCell{
  @IBOutlet weak var label: UILabel!
  @IBOutlet weak var date: UILabel!
  @IBOutlet weak var taskCount: UILabel!
  var entry: Entry!

  //Task Count
  func setupRealmListener(){    
    let realm = try! Realm()
    guard !realm.isInWriteTransaction else{ return }
    //***
    token = realm.observe{ notification, realm in
      let tasks = realm.objects(Task.self).filter("entry = %@", self.entry)
      taskCount.text = "\(tasks.count)"
    }
  }

  deinit {
    token?.invalidate()
  }
}

Есть несколько причин, по которым я пошел по этому пути, но мне интересно, есть лучший способ:

  1. У меня есть уведомление об изменении моей коллекции entries, но оно не срабатывает при добавлении / изменении задачи.

  2. Я использую уведомление области для EntryCell, но кажется, что множество ресурсов висит на одной ячейке таблицы.

I Я получаю тонны предупреждений от Realm, потому что у меня есть уведомление о моем UITableViewCell, и, поскольку оно dequeue 'd, оно, похоже, не deinit' d:

RLMNotificationToken выпущен без отмены регистрации уведомления. Вы должны держаться за RLMNotificationToken, возвращенный из addNotificationBlock, и вызывать [RLMNotificationToken invalidate], когда вы больше не будете sh, чтобы получать уведомления RLMRealm.

Любые идеи по улучшению способа обновления количество задач для каждой записи отдельно, без перезагрузки всей таблицы?

1 Ответ

0 голосов
/ 13 марта 2020

Я нашел хорошее решение для этого. Я знаю, что мог добавить список tasks в мою схему Entry, но мне никогда не нравилось управлять списками. Я, кажется, получаю больше сбоев из-за недействительных / удаленных объектов и тому подобного, и я постоянно переживаю, что порядок как-то испортится.

Вместо этого, когда я добавляю или удаляю task, я просто обновляю метку времени на моем entry объекте, чтобы его уведомления запускались:

let realm = try! Realm()
realm.beginWrite()

//Update the task
task.name = "New stuff here..."

//Ping the entry so its notifications fire
if let entry = task.entry{
  entry.updated = Date()
}

try! realm.commitWrite()

Это довольно простая техника и кажется, отвечает моим потребностям. Теперь я могу удалить уведомление для каждой записи в ячейке таблицы.

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