Compare commits
2 Commits
f4f2a5546c
...
5a098df931
Author | SHA1 | Date |
---|---|---|
Shadowfacts | 5a098df931 | |
Shadowfacts | 9812d4aff2 |
|
@ -78,8 +78,8 @@ class MastodonCachePersistentStore: NSPersistentContainer {
|
||||||
if self.backgroundContext.hasChanges {
|
if self.backgroundContext.hasChanges {
|
||||||
try! self.backgroundContext.save()
|
try! self.backgroundContext.save()
|
||||||
}
|
}
|
||||||
completion?()
|
|
||||||
statuses.forEach { self.statusSubject.send($0.id) }
|
statuses.forEach { self.statusSubject.send($0.id) }
|
||||||
|
completion?()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -142,4 +142,27 @@ class MastodonCachePersistentStore: NSPersistentContainer {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func performBatchUpdates(_ block: @escaping (_ context: NSManagedObjectContext, _ addAccounts: ([Account]) -> Void, _ addStatuses: ([Status]) -> Void) -> Void, completion: (() -> Void)? = nil) {
|
||||||
|
backgroundContext.perform {
|
||||||
|
var updatedAccounts = [String]()
|
||||||
|
var updatedStatuses = [String]()
|
||||||
|
|
||||||
|
block(self.backgroundContext, { (accounts) in
|
||||||
|
accounts.forEach { self.upsert(account: $0) }
|
||||||
|
updatedAccounts.append(contentsOf: accounts.map { $0.id })
|
||||||
|
}, { (statuses) in
|
||||||
|
statuses.forEach { self.upsert(status: $0, incrementReferenceCount: true) }
|
||||||
|
updatedStatuses.append(contentsOf: statuses.map { $0.id })
|
||||||
|
})
|
||||||
|
|
||||||
|
updatedAccounts.forEach(self.accountSubject.send)
|
||||||
|
updatedStatuses.forEach(self.statusSubject.send)
|
||||||
|
|
||||||
|
if self.backgroundContext.hasChanges {
|
||||||
|
try! self.backgroundContext.save()
|
||||||
|
}
|
||||||
|
completion?()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,7 +43,6 @@ class ConversationTableViewController: EnhancedTableViewController {
|
||||||
}
|
}
|
||||||
|
|
||||||
deinit {
|
deinit {
|
||||||
mastodonController.persistentContainer.status(for: mainStatusID)?.decrementReferenceCount()
|
|
||||||
for (id, _) in statuses {
|
for (id, _) in statuses {
|
||||||
mastodonController.persistentContainer.status(for: id)?.decrementReferenceCount()
|
mastodonController.persistentContainer.status(for: id)?.decrementReferenceCount()
|
||||||
}
|
}
|
||||||
|
|
|
@ -116,10 +116,8 @@ class SearchResultsViewController: EnhancedTableViewController {
|
||||||
}
|
}
|
||||||
self.currentQuery = query
|
self.currentQuery = query
|
||||||
|
|
||||||
if self.dataSource.snapshot().numberOfItems == 0 {
|
|
||||||
activityIndicator.isHidden = false
|
activityIndicator.isHidden = false
|
||||||
activityIndicator.startAnimating()
|
activityIndicator.startAnimating()
|
||||||
}
|
|
||||||
|
|
||||||
let request = Client.search(query: query, resolve: true, limit: 10)
|
let request = Client.search(query: query, resolve: true, limit: 10)
|
||||||
mastodonController.run(request) { (response) in
|
mastodonController.run(request) { (response) in
|
||||||
|
@ -132,11 +130,25 @@ class SearchResultsViewController: EnhancedTableViewController {
|
||||||
|
|
||||||
guard self.currentQuery == query else { return }
|
guard self.currentQuery == query else { return }
|
||||||
|
|
||||||
|
let oldSnapshot = self.dataSource.snapshot()
|
||||||
var snapshot = NSDiffableDataSourceSnapshot<Section, Item>()
|
var snapshot = NSDiffableDataSourceSnapshot<Section, Item>()
|
||||||
|
|
||||||
|
self.mastodonController.persistentContainer.performBatchUpdates({ (context, addAccounts, addStatuses) in
|
||||||
|
// todo: reference count accounts
|
||||||
|
// oldSnapshot.itemIdentifiers(inSection: .accounts).forEach { (item) in
|
||||||
|
// guard case let .account(id) = item else { return }
|
||||||
|
// self.mastodonController.persistentContainer.account(for: id, in: context)?.decrementReferenceCount()
|
||||||
|
// }
|
||||||
|
|
||||||
|
oldSnapshot.itemIdentifiers(inSection: .statuses).forEach { (item) in
|
||||||
|
guard case let .status(id, _) = item else { return }
|
||||||
|
self.mastodonController.persistentContainer.status(for: id, in: context)?.decrementReferenceCount()
|
||||||
|
}
|
||||||
|
|
||||||
if self.onlySections.contains(.accounts) && !results.accounts.isEmpty {
|
if self.onlySections.contains(.accounts) && !results.accounts.isEmpty {
|
||||||
snapshot.appendSections([.accounts])
|
snapshot.appendSections([.accounts])
|
||||||
snapshot.appendItems(results.accounts.map { .account($0.id) }, toSection: .accounts)
|
snapshot.appendItems(results.accounts.map { .account($0.id) }, toSection: .accounts)
|
||||||
self.mastodonController.persistentContainer.addAll(accounts: results.accounts)
|
addAccounts(results.accounts)
|
||||||
}
|
}
|
||||||
if self.onlySections.contains(.hashtags) && !results.hashtags.isEmpty {
|
if self.onlySections.contains(.hashtags) && !results.hashtags.isEmpty {
|
||||||
snapshot.appendSections([.hashtags])
|
snapshot.appendSections([.hashtags])
|
||||||
|
@ -145,11 +157,15 @@ class SearchResultsViewController: EnhancedTableViewController {
|
||||||
if self.onlySections.contains(.statuses) && !results.statuses.isEmpty {
|
if self.onlySections.contains(.statuses) && !results.statuses.isEmpty {
|
||||||
snapshot.appendSections([.statuses])
|
snapshot.appendSections([.statuses])
|
||||||
snapshot.appendItems(results.statuses.map { .status($0.id, .unknown) }, toSection: .statuses)
|
snapshot.appendItems(results.statuses.map { .status($0.id, .unknown) }, toSection: .statuses)
|
||||||
self.mastodonController.persistentContainer.addAll(statuses: results.statuses)
|
addStatuses(results.statuses)
|
||||||
self.mastodonController.persistentContainer.addAll(accounts: results.statuses.map { $0.account })
|
addAccounts(results.statuses.map { $0.account })
|
||||||
}
|
}
|
||||||
|
}, completion: {
|
||||||
|
DispatchQueue.main.async {
|
||||||
self.dataSource.apply(snapshot)
|
self.dataSource.apply(snapshot)
|
||||||
}
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Table view delegate
|
// MARK: - Table view delegate
|
||||||
|
|
Loading…
Reference in New Issue