From 89b97be07d3f3a5c578c818f1866c3512ffe4e62 Mon Sep 17 00:00:00 2001 From: dscyrescotti Date: Mon, 10 Jun 2024 00:46:02 +0700 Subject: [PATCH] feat: fetch eraser objects instead of loading from stroke --- Memola/Canvas/Contexts/GraphicContext.swift | 4 +++- .../Geometries/Stroke/Strokes/PenStroke.swift | 17 +++++++++++++++-- Memola/Features/Memos/MemosView.swift | 1 + Memola/Persistence/Objects/EraserObject.swift | 1 + .../Objects/GraphicContextObject.swift | 1 + .../MemolaModel.xcdatamodel/contents | 2 ++ 6 files changed, 23 insertions(+), 3 deletions(-) diff --git a/Memola/Canvas/Contexts/GraphicContext.swift b/Memola/Canvas/Contexts/GraphicContext.swift index 20da0fc..d54af58 100644 --- a/Memola/Canvas/Contexts/GraphicContext.swift +++ b/Memola/Canvas/Contexts/GraphicContext.swift @@ -160,7 +160,7 @@ extension GraphicContext { thickness: pen.thickness ) eraserStroke.graphicContext = self - withPersistence(\.backgroundContext) { [_stroke = eraserStroke] context in + withPersistence(\.backgroundContext) { [graphicContext = object, _stroke = eraserStroke] context in let stroke = EraserObject(\.backgroundContext) stroke.bounds = _stroke.bounds stroke.color = _stroke.color @@ -169,6 +169,8 @@ extension GraphicContext { stroke.createdAt = _stroke.createdAt stroke.quads = [] stroke.strokes = .init() + stroke.graphicContext = graphicContext + graphicContext?.erasers.add(stroke) _stroke.object = stroke try context.saveIfNeeded() } diff --git a/Memola/Canvas/Geometries/Stroke/Strokes/PenStroke.swift b/Memola/Canvas/Geometries/Stroke/Strokes/PenStroke.swift index 2bdd8b8..38637c3 100644 --- a/Memola/Canvas/Geometries/Stroke/Strokes/PenStroke.swift +++ b/Memola/Canvas/Geometries/Stroke/Strokes/PenStroke.swift @@ -81,8 +81,8 @@ final class PenStroke: Stroke, @unchecked Sendable { guard let quad = quad as? QuadObject else { return nil } return Quad(object: quad) } - eraserStrokes = Set(object.erasers.compactMap { [graphicContext] eraser -> EraserStroke? in - guard let eraser = eraser as? EraserObject else { return nil } + let erasers = fetchErasers(of: object) + eraserStrokes = Set(erasers.compactMap { [graphicContext] eraser -> EraserStroke? in let url = eraser.objectID.uriRepresentation() return graphicContext.barrierQueue.sync(flags: .barrier) { if graphicContext.erasers[url] == nil { @@ -96,6 +96,19 @@ final class PenStroke: Stroke, @unchecked Sendable { }) } + func fetchErasers(of stroke: StrokeObject) -> [EraserObject] { + let fetchRequest: NSFetchRequest = .init(entityName: "EraserObject") + fetchRequest.predicate = NSPredicate(format: "ANY strokes == %@", stroke) + + do { + let erasers = try Persistence.shared.backgroundContext.fetch(fetchRequest) + return erasers + } catch { + NSLog("[Memola] - \(error.localizedDescription)") + } + return [] + } + func addQuad(at point: CGPoint, rotation: CGFloat, shape: QuadShape) { let quad = Quad( origin: point, diff --git a/Memola/Features/Memos/MemosView.swift b/Memola/Features/Memos/MemosView.swift index 331016c..6ff6fe9 100644 --- a/Memola/Features/Memos/MemosView.swift +++ b/Memola/Features/Memos/MemosView.swift @@ -85,6 +85,7 @@ struct MemosView: View { let graphicContextObject = GraphicContextObject(\.viewContext) graphicContextObject.strokes = [] + graphicContextObject.erasers = .init() memoObject.canvas = canvasObject memoObject.tool = toolObject diff --git a/Memola/Persistence/Objects/EraserObject.swift b/Memola/Persistence/Objects/EraserObject.swift index 7c5ac48..5c35ab5 100644 --- a/Memola/Persistence/Objects/EraserObject.swift +++ b/Memola/Persistence/Objects/EraserObject.swift @@ -17,4 +17,5 @@ final class EraserObject: NSManagedObject { @NSManaged var thickness: CGFloat @NSManaged var quads: NSMutableOrderedSet @NSManaged var strokes: NSMutableSet + @NSManaged var graphicContext: GraphicContextObject? } diff --git a/Memola/Persistence/Objects/GraphicContextObject.swift b/Memola/Persistence/Objects/GraphicContextObject.swift index f62a765..9d97a0b 100644 --- a/Memola/Persistence/Objects/GraphicContextObject.swift +++ b/Memola/Persistence/Objects/GraphicContextObject.swift @@ -12,4 +12,5 @@ import Foundation final class GraphicContextObject: NSManagedObject { @NSManaged var canvas: CanvasObject? @NSManaged var strokes: NSMutableOrderedSet + @NSManaged var erasers: NSMutableSet } diff --git a/Memola/Resources/Models/MemolaModel.xcdatamodeld/MemolaModel.xcdatamodel/contents b/Memola/Resources/Models/MemolaModel.xcdatamodeld/MemolaModel.xcdatamodel/contents index c9ca0bf..862dffc 100644 --- a/Memola/Resources/Models/MemolaModel.xcdatamodeld/MemolaModel.xcdatamodel/contents +++ b/Memola/Resources/Models/MemolaModel.xcdatamodeld/MemolaModel.xcdatamodel/contents @@ -12,11 +12,13 @@ + +