feat: add prefetching feaature for reporting
This commit is contained in:
parent
36a6b8b8cc
commit
d66491b726
|
@ -68,6 +68,7 @@ class ReportViewController: UIViewController, NeedsDependency {
|
||||||
tableView.backgroundColor = .clear
|
tableView.backgroundColor = .clear
|
||||||
tableView.translatesAutoresizingMaskIntoConstraints = false
|
tableView.translatesAutoresizingMaskIntoConstraints = false
|
||||||
tableView.delegate = self
|
tableView.delegate = self
|
||||||
|
tableView.prefetchDataSource = self
|
||||||
tableView.allowsMultipleSelection = true
|
tableView.allowsMultipleSelection = true
|
||||||
return tableView
|
return tableView
|
||||||
}()
|
}()
|
||||||
|
@ -310,6 +311,7 @@ class ReportViewController: UIViewController, NeedsDependency {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MARK: - UITableViewDelegate
|
||||||
extension ReportViewController: UITableViewDelegate {
|
extension ReportViewController: UITableViewDelegate {
|
||||||
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
|
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
|
||||||
guard let item = viewModel.diffableDataSource?.itemIdentifier(for: indexPath) else {
|
guard let item = viewModel.diffableDataSource?.itemIdentifier(for: indexPath) else {
|
||||||
|
@ -326,6 +328,14 @@ extension ReportViewController: UITableViewDelegate {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MARK: - UITableViewDataSourcePrefetching
|
||||||
|
extension ReportViewController: UITableViewDataSourcePrefetching {
|
||||||
|
func tableView(_ tableView: UITableView, prefetchRowsAt indexPaths: [IndexPath]) {
|
||||||
|
viewModel.prefetchData(prefetchRowsAt: indexPaths)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: - UITextViewDelegate
|
||||||
extension ReportViewController: UITextViewDelegate {
|
extension ReportViewController: UITextViewDelegate {
|
||||||
func textViewDidChange(_ textView: UITextView) {
|
func textViewDidChange(_ textView: UITextView) {
|
||||||
self.comment.send(textView.text)
|
self.comment.send(textView.text)
|
||||||
|
|
|
@ -97,4 +97,42 @@ extension ReportViewModel {
|
||||||
}
|
}
|
||||||
.store(in: &disposeBag)
|
.store(in: &disposeBag)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func prefetchData(prefetchRowsAt indexPaths: [IndexPath]) {
|
||||||
|
guard let diffableDataSource = diffableDataSource else { return }
|
||||||
|
|
||||||
|
// prefetch reply status
|
||||||
|
guard let activeMastodonAuthenticationBox = context.authenticationService.activeMastodonAuthenticationBox.value else { return }
|
||||||
|
let domain = activeMastodonAuthenticationBox.domain
|
||||||
|
|
||||||
|
var statusObjectIDs: [NSManagedObjectID] = []
|
||||||
|
for indexPath in indexPaths {
|
||||||
|
let item = diffableDataSource.itemIdentifier(for: indexPath)
|
||||||
|
switch item {
|
||||||
|
case .reportStatus(let objectID, _):
|
||||||
|
statusObjectIDs.append(objectID)
|
||||||
|
default:
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let backgroundManagedObjectContext = context.backgroundManagedObjectContext
|
||||||
|
backgroundManagedObjectContext.perform { [weak self] in
|
||||||
|
guard let self = self else { return }
|
||||||
|
for objectID in statusObjectIDs {
|
||||||
|
let status = backgroundManagedObjectContext.object(with: objectID) as! Status
|
||||||
|
guard let replyToID = status.inReplyToID, status.replyTo == nil else {
|
||||||
|
// skip
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
self.context.statusPrefetchingService.prefetchReplyTo(
|
||||||
|
domain: domain,
|
||||||
|
statusObjectID: status.objectID,
|
||||||
|
statusID: status.id,
|
||||||
|
replyToStatusID: replyToID,
|
||||||
|
authorizationBox: activeMastodonAuthenticationBox
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue