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:
Riley Testut
2020-10-05 14:23:19 -07:00
parent c8b4ce8d38
commit 00e8b7c80e
2 changed files with 53 additions and 0 deletions

View 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
}
}