DEV Community

GoyesDev
GoyesDev

Posted on

[SC] Sendable y NSManageObject

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
  }
}
Enter fullscreen mode Exit fullscreen mode

¿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 { // ...
Enter fullscreen mode Exit fullscreen mode

¿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.


Recordar sin releer

Con tus propias palabras, ¿cómo conecta un DAO con su objeto gestionado correspondiente?

¿Qué ocurriría en Swift 6 si intentas añadir conformancia Sendable directamente a un NSManagedObject?


Revisión y síntesis

¿Cuál es la regla fundamental que debes seguir al trabajar con Core Data y Swift Concurrency, con o sin DAOs?

¿En qué escenarios recomendarías usar DAOs frente a pasar únicamente NSManagedObjectID?


Bibliografía

Top comments (0)