Fix retain cycle in timeline cell cache observers

The use an unowned reference to self because when the cell is deinit'd,
the Combine observers will be cancelled.
This commit is contained in:
Shadowfacts 2020-01-19 23:14:51 -05:00
parent 2f630f2f8f
commit ee252c02e9
Signed by: shadowfacts
GPG Key ID: 94A5AB95422746E5
2 changed files with 7 additions and 6 deletions

View File

@ -100,16 +100,16 @@ class BaseStatusTableViewCell: UITableViewCell {
open func createObserversIfNecessary() { open func createObserversIfNecessary() {
if statusUpdater == nil { if statusUpdater == nil {
statusUpdater = mastodonController.cache.statusSubject statusUpdater = mastodonController.cache.statusSubject
.filter { $0.id == self.statusID } .filter { [unowned self] in $0.id == self.statusID }
.receive(on: DispatchQueue.main) .receive(on: DispatchQueue.main)
.sink(receiveValue: updateStatusState(status:)) .sink { [unowned self] in self.updateStatusState(status: $0) }
} }
if accountUpdater == nil { if accountUpdater == nil {
accountUpdater = mastodonController.cache.accountSubject accountUpdater = mastodonController.cache.accountSubject
.filter { $0.id == self.accountID } .filter { [unowned self] in $0.id == self.accountID }
.receive(on: DispatchQueue.main) .receive(on: DispatchQueue.main)
.sink(receiveValue: updateUI(account:)) .sink { [unowned self] in self.updateUI(account: $0) }
} }
} }

View File

@ -49,9 +49,9 @@ class TimelineStatusTableViewCell: BaseStatusTableViewCell {
if rebloggerAccountUpdater == nil { if rebloggerAccountUpdater == nil {
rebloggerAccountUpdater = mastodonController.cache.accountSubject rebloggerAccountUpdater = mastodonController.cache.accountSubject
.filter { $0.id == self.rebloggerID } .filter { [unowned self] in $0.id == self.rebloggerID }
.receive(on: DispatchQueue.main) .receive(on: DispatchQueue.main)
.sink(receiveValue: updateRebloggerLabel(reblogger:)) .sink { [unowned self] in self.updateRebloggerLabel(reblogger: $0) }
} }
} }
@ -95,6 +95,7 @@ class TimelineStatusTableViewCell: BaseStatusTableViewCell {
} }
func updateTimestamp() { func updateTimestamp() {
guard superview != nil else { return }
guard let status = mastodonController.cache.status(for: statusID) else { fatalError("Missing cached status \(statusID!)") } guard let status = mastodonController.cache.status(for: statusID) else { fatalError("Missing cached status \(statusID!)") }
timestampLabel.text = status.createdAt.timeAgoString() timestampLabel.text = status.createdAt.timeAgoString()