Comprensión durante la lectura
¿Por qué es inseguro pasar NSManagedObject entre hilos en Core Data?
No se puede usar un NSManagedObject extraído con un viewContext desde un hilo de segundo plano.
¿Por qué no se puede hacer que un NSManagedObject conforme al protocolo Sendable?
Para conformar Sendable, no se puede heredar de ninguna clase o, de hacerlo, solo se puede heredar de NSObject.
¿Qué problema específico introduce el uso de @unchecked Sendable en los NSManagedObjects?
@unchecked Sendable solo quita la advertencia, pero no hace que un tipo de dato se vuelva Sendable.
¿Qué es un Data Access Object (DAO) y cuál es su función en este contexto?
El artículo presenta el concepto de "Data Access Object" (no confundir con el patrón "DAO") refiriéndose a un DTO que refleja a un NSManagedObject en todos sus atributos, y tiene un identificador de tipo NSManagedObjectID.
Lo importante de este objeto "DAO" es que puede ser struct, con todos sus atributos inmutables, con lo que es un perfecto candidato para ser Sendable.
Por ejemplo:
@objc(Article)
public class Article: NSManagedObject, Identifiable {
@nonobjc public class func fetchRequest() -> NSFetchRequest<Article> {
return NSFetchRequest<Article>(entityName: "Article")
}
@NSManaged public var title: String?
@NSManaged public var timestamp: Date?
}
struct ArticleDAO: Sendable, Identifiable {
let id: NSManagedObjectID
let title: String
let timestamp: Date
init?(managedObject: Article) {
guard let title = managedObject.title, let timestamp = managedObject.timestamp else {
return nil
}
self.id = managedObject.objectID
self.title = title
self.timestamp = timestamp
}
}
¿Por qué NSManagedObjectID sí puede pasarse entre hilos de forma segura?
NSManagedObjectID, a pesar de ser class, sí es Sendable.
open class NSManagedObjectID : NSObject, NSCopying, @unchecked Sendable { // ...
¿Qué limitaciones tiene migrar un proyecto existente al patrón DAO?
Para migrar un proyecto existente al patrón DAO del artículo, sería necesario reescribir la aplicación para usar los nuevos DTOs, y esto implicaría reescribir la lógica de extracción y modificación de información de la base de datos.
¿Qué alternativa existe para proyectos que no pueden migrar a DAOs?
En principio, no hay errores de compilación al usar Swift 6. Sin embargo, en lo posible se sugiere mover únicamente el NSManagedObjectID.
¿Cómo se estructura un DAO para un NSManagedObject como Article?
El DTO ArticleDAO tendría todas las propiedades del NSManagedObject, Article. También guarda el objectID del NSManagedObject de tipo NSManagedObjectID. Todas estas deben ser inmutables. Además, idealmente que sea un struct para poder conformar Sendable.
Top comments (0)