Files
Zockerhoehle/Zockerhoehle/ViewModel/GameStore.swift

98 lines
3.2 KiB
Swift

//
// GameStore.swift
// Zockerhoehle
//
// Created by Julian-Steffen Müller on 02.08.19.
// Copyright © 2019 Julian-Steffen Müller. All rights reserved.
//
import Foundation
import SwiftUI
import CoreData
import Combine
class GameStore : NSObject, ObservableObject, NSFetchedResultsControllerDelegate {
var objectWillChange = PassthroughSubject<Void , Never>()
var consoleFilter : Console?
var gameSeriesFilter : GameSeries?
var sortDescriptors : [NSSortDescriptor] = [NSSortDescriptor(key: "name", ascending: true)]
var fetchLimit : Int = 0
var games : [Game] {
get {
if self.fetchResultsController.fetchedObjects == nil {
do {
try fetchResultsController.performFetch()
}catch {
print("GameStore::games Perform Fetch not possible '\(error)'")
}
}
let result = self.fetchResultsController.fetchedObjects ?? []
//Anscheinend ein Bug im FetchResultController das er das fetchLimit manchmal ignoriert
if self.fetchLimit > 0 && result.count > self.fetchLimit {
print("GameStore::games Fetch limit of ignored. Expected: \(self.fetchLimit) Delivered: \(result.count)")
var clampedResult : [Game] = []
for index in 0..<self.fetchLimit {
clampedResult.append(result[index])
}
return clampedResult
}
return result
}
}
lazy var fetchResultsController : NSFetchedResultsController<Game> = {
var gamesFetch : NSFetchRequest<Game> = Game.fetchRequest()
/*if let console = consoleFilter {
gamesFetch = Game.fetchRequest(console: console)
}else if let gameSeries = gameSeriesFilter {
gamesFetch = Game.fetchRequest(gameSeries: gameSeries)
}else {
print("No filter: fetch Limit: \(self.fetchLimit)")
}*/
gamesFetch.fetchLimit = self.fetchLimit
gamesFetch.sortDescriptors = self.sortDescriptors
let gamesFetchRC = NSFetchedResultsController(fetchRequest: gamesFetch, managedObjectContext: CDManager.shared.viewContext, sectionNameKeyPath: nil, cacheName: nil)
gamesFetchRC.delegate = self
return gamesFetchRC
}()
init(console : Console?, fetchLimit : Int = 0) {
super.init()
self.consoleFilter = console
self.fetchLimit = fetchLimit
}
init(gameSeries: GameSeries?, fetchLimit : Int = 0) {
super.init()
self.gameSeriesFilter = gameSeries
self.fetchLimit = fetchLimit
}
init(sortDescriptors : [NSSortDescriptor], fetchLimit : Int = 0) {
super.init()
self.sortDescriptors = sortDescriptors
self.fetchLimit = fetchLimit
}
init(fetchLimit : Int = 0) {
super.init()
self.fetchLimit = fetchLimit
}
func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
self.objectWillChange.send()
}
}