mirror of
https://github.com/kean/Pulse.git
synced 2026-05-30 21:07:33 +00:00
51 lines
2.0 KiB
Swift
51 lines
2.0 KiB
Swift
// The MIT License (MIT)
|
|
//
|
|
// Copyright (c) 2020-2024 Alexander Grebenyuk (github.com/kean).
|
|
|
|
import Foundation
|
|
import CoreData
|
|
import Pulse
|
|
import Combine
|
|
import SwiftUI
|
|
|
|
final class ManagedObjectsObserver<T: NSManagedObject>: NSObject, NSFetchedResultsControllerDelegate {
|
|
@Published private(set) var objects: [T] = []
|
|
|
|
private let controller: NSFetchedResultsController<T>
|
|
|
|
init(request: NSFetchRequest<T>,
|
|
context: NSManagedObjectContext,
|
|
cacheName: String? = nil) {
|
|
self.controller = NSFetchedResultsController(fetchRequest: request, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: cacheName)
|
|
super.init()
|
|
|
|
try? controller.performFetch()
|
|
objects = controller.fetchedObjects ?? []
|
|
|
|
controller.delegate = self
|
|
}
|
|
|
|
func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
|
|
objects = self.controller.fetchedObjects ?? []
|
|
}
|
|
}
|
|
|
|
extension ManagedObjectsObserver where T == LoggerMessageEntity {
|
|
static func pins(for context: NSManagedObjectContext) -> ManagedObjectsObserver {
|
|
let request = NSFetchRequest<LoggerMessageEntity>(entityName: "\(LoggerMessageEntity.self)")
|
|
request.sortDescriptors = [NSSortDescriptor(keyPath: \LoggerMessageEntity.createdAt, ascending: false)]
|
|
request.predicate = NSPredicate(format: "isPinned == YES")
|
|
|
|
return ManagedObjectsObserver(request: request, context: context, cacheName: "com.github.pulse.pins-cache")
|
|
}
|
|
}
|
|
|
|
extension ManagedObjectsObserver where T == LoggerSessionEntity {
|
|
static func sessions(for context: NSManagedObjectContext) -> ManagedObjectsObserver {
|
|
let request = NSFetchRequest<LoggerSessionEntity>(entityName: "\(LoggerSessionEntity.self)")
|
|
request.sortDescriptors = [NSSortDescriptor(keyPath: \LoggerSessionEntity.createdAt, ascending: false)]
|
|
|
|
return ManagedObjectsObserver(request: request, context: context, cacheName: "com.github.pulse.sessions-cache")
|
|
}
|
|
}
|