mirror of
https://github.com/SideStore/SideStore.git
synced 2026-02-09 06:43:25 +01:00
Adds @Managed property wrapper
• Keeps strong reference to wrapped managed object’s context. • Projected value simplifies accessing properties on context’s thread.
This commit is contained in:
49
AltStore/Types/Managed.swift
Normal file
49
AltStore/Types/Managed.swift
Normal file
@@ -0,0 +1,49 @@
|
||||
//
|
||||
// Managed.swift
|
||||
// AltStore
|
||||
//
|
||||
// Created by Riley Testut on 10/5/20.
|
||||
// Copyright © 2020 Riley Testut. All rights reserved.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import CoreData
|
||||
|
||||
@propertyWrapper @dynamicMemberLookup
|
||||
struct Managed<ManagedObject: NSManagedObject>
|
||||
{
|
||||
var wrappedValue: ManagedObject {
|
||||
didSet {
|
||||
self.managedObjectContext = self.wrappedValue.managedObjectContext
|
||||
}
|
||||
}
|
||||
private var managedObjectContext: NSManagedObjectContext?
|
||||
|
||||
var projectedValue: Managed<ManagedObject> {
|
||||
return self
|
||||
}
|
||||
|
||||
init(wrappedValue: ManagedObject)
|
||||
{
|
||||
self.wrappedValue = wrappedValue
|
||||
self.managedObjectContext = wrappedValue.managedObjectContext
|
||||
}
|
||||
|
||||
subscript<T>(dynamicMember keyPath: KeyPath<ManagedObject, T>) -> T
|
||||
{
|
||||
var result: T!
|
||||
|
||||
if let context = self.managedObjectContext
|
||||
{
|
||||
context.performAndWait {
|
||||
result = self.wrappedValue[keyPath: keyPath]
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
result = self.wrappedValue[keyPath: keyPath]
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user