98 lines
3.2 KiB
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()
|
|
}
|
|
}
|