Tengo este protocolo:
protocol ManagedObjectProtocol {
associatedtype Entity
static var identifierKey: String { get }
static func fetchRequest() -> NSFetchRequest<NSFetchRequestResult>
func toEntity() -> Entity?
}
Confirmo a algunos de mis NSManagedObject clases con extensión como esta:
extension AppEntity: ManagedObjectProtocol {
typealias Entity = App
static var identifierKey: String {
return "articleId"
}
func toEntity() -> Entity? {
return nil
}
}
Cuando trato de archivo con el nuevo Xcode 13 me sale este error:
Tipo de 'AppEntity' no se ajusta al protocolo de ManagedObjectProtocol'
Pero cuando trato de ejecutar este código en mi dispositivo con el que se construye bien.
Se fue construyendo/archivado bien con Xcode de 12 años y más versiones, pero con el nuevo Xcode 13 (y Xcode 13.1) tengo un problema. De dónde podría estar el problema? ¿Cómo puedo solucionarlo?
Una cosa más que me sale como error a la hora de archivar y no cuando la generación de depuración. Tengo este código palestra obtener de la entidad:
func get<Entity: NSManagedObject>
(with predicate: NSPredicate? = nil,
sortDescriptors: [NSSortDescriptor]? = nil,
fetchLimit: Int? = nil,
inContext context: NSManagedObjectContext? = nil,
completion: @escaping (Result<[Entity], Error>) -> Void) {
if let ctx = context {
coreData.performTask({ (context) in
do {
let fetchRequest = Entity.fetchRequest()
fetchRequest.predicate = predicate
fetchRequest.sortDescriptors = sortDescriptors
if let fetchLimit = fetchLimit {
fetchRequest.fetchLimit = fetchLimit
}
let results = try context.fetch(fetchRequest) as? [Entity]
completion(.success(results ?? []))
} catch {
completion(.failure(error))
}
}, inContext: ctx)
} else {
coreData.performForegroundTask { context in
do {
let fetchRequest = Entity.fetchRequest()
fetchRequest.predicate = predicate
fetchRequest.sortDescriptors = sortDescriptors
if let fetchLimit = fetchLimit {
fetchRequest.fetchLimit = fetchLimit
}
let results = try context.fetch(fetchRequest) as? [Entity]
completion(.success(results ?? []))
} catch {
completion(.failure(error))
}
}
}
}
Tengo estos mensajes de error:
Tipo de "Entidad" no tiene ningún miembro 'fetchRequest'
Qué tiene de malo? Cómo puedo solucionar estos Datos principales errores a la hora de archivar?
Gracias por la ayuda
Editar:
Un ejemplo más para el método auxiliar en la que tengo un error con no member fetchRequest
:
func count(entity: NSManagedObject.Type,
with predicate: NSPredicate? = nil,
fetchLimit: Int? = nil,
completion: @escaping (Result<Int, Error>) -> Void) {
coreData.performForegroundTask { context in
do {
let fetchRequest = entity.fetchRequest()
fetchRequest.predicate = predicate
if let fetchLimit = fetchLimit {
fetchRequest.fetchLimit = fetchLimit
}
let count = try context.count(for: fetchRequest)
completion(.success(count))
} catch {
completion(.failure(error))
}
}
}