在上下文之外创建 NSManagedObject
Creating NSManagedObject outside context
我已经阅读了很多关于这个问题的主题,但没有真正找到合适的答案。我想在没有上下文的情况下创建 NSManagedObject
的实例。
原因如下:应用从服务器获取 soap 应答。这个答案必须保存到核心数据中。答案看起来像一棵树。
我的想法是为每个实体覆盖 init
,以便它获取数据。之后,我将能够创建根实体,根实体的创建将调用另一个实体的创建,依此类推。
应用程序中负责发出请求的部分是通过泛型实现的。有描述每个响应 class 必须具有的 init
的协议,例如。 g.:
public protocol Parsable {
init(data: Data)
}
正如您所见,这里没有上下文的余地。相反,我想创建所有这些实体并将其一次性保存到上下文中。
此处的替代解决方案是复制 classes,用响应填充它,然后将其复制到我的核心数据实体中。但这是我想避免的不必要的重复。
任何想法将不胜感激。
实际上,出于很多原因,"The alternative solution here is to make duplicated classes" 是唯一好的解决方案。
在你的情况下,你似乎已经有 2 个这样的对象代表同一个实体。我假设你从服务器收到的是 JSON 解析成字典。这是一个代表同一个实体的对象。因此,要将其传输到核心数据中,您已经拥有 1 个从字典到核心数据管理对象的映射器。
假设托管对象适合直接在更高级别的应用程序中使用是错误的。我们为此使用包装器。因此,您需要一个 class 来处理所有数据传输,然后让所有接口都可以在任何模块和任何线程中使用数据。这就是为什么您需要将所有数据传输到一个可以包装托管对象的新 class。
所以假设您有一个名为 MyObject
的 class 和一个核心数据 class MyObjectEntity
,并且可能还有一本 API 的字典。然后 MyObject
的接口将是:
init(entity: MyObjectEntity) // Wraps the entity and copies all fields to this class
init(descriptor: [String: Any]) // Copies all fields to this class
var descriptor: [String: Any] // Returns a dictionary ready to be parsed to JSON
func writeToManagedObject() // Will copy all the data to managed object. If the object exists it will modify it, if not it will create a new one. This will not save the database.
通过一些子classing 和一些扩展,您可以创建一个非常好的系统,即使您有许多需要映射的模型。并且由于此 class 对从任何线程 and/or 进行访问完全不敏感,保存上下文它已准备好进行任何其他高级操作。据我所知,您甚至可以将其用作 MVVM。
使您的数据 class 在适当的时候发出 NSManagedObject subclass,并传递给具有 moc 的代码部分。对于程序的其余部分,只需处理您的非 MOC class。示例如下。
示例:
class MyMOCDataClass : NSManagedObject {
public var myName:String
public var myAge:Int16
}
class MyDataClass {
public var myName:String
public var myAge:Int16
init(...){
//whatever else you may or may not need to do here.
}
func emitWithMoc( moc: NSManagedObjectContext ) -> MyMOCDataClass {
var tmpMocClass = MyMOCDataClass( context: moc )
tmpMocClass.myName = self.myName
tmpMocClass.myAge = self.myAge
return tmpMocClass;
}
我已经阅读了很多关于这个问题的主题,但没有真正找到合适的答案。我想在没有上下文的情况下创建 NSManagedObject
的实例。
原因如下:应用从服务器获取 soap 应答。这个答案必须保存到核心数据中。答案看起来像一棵树。
我的想法是为每个实体覆盖 init
,以便它获取数据。之后,我将能够创建根实体,根实体的创建将调用另一个实体的创建,依此类推。
应用程序中负责发出请求的部分是通过泛型实现的。有描述每个响应 class 必须具有的 init
的协议,例如。 g.:
public protocol Parsable {
init(data: Data)
}
正如您所见,这里没有上下文的余地。相反,我想创建所有这些实体并将其一次性保存到上下文中。
此处的替代解决方案是复制 classes,用响应填充它,然后将其复制到我的核心数据实体中。但这是我想避免的不必要的重复。
任何想法将不胜感激。
实际上,出于很多原因,"The alternative solution here is to make duplicated classes" 是唯一好的解决方案。
在你的情况下,你似乎已经有 2 个这样的对象代表同一个实体。我假设你从服务器收到的是 JSON 解析成字典。这是一个代表同一个实体的对象。因此,要将其传输到核心数据中,您已经拥有 1 个从字典到核心数据管理对象的映射器。
假设托管对象适合直接在更高级别的应用程序中使用是错误的。我们为此使用包装器。因此,您需要一个 class 来处理所有数据传输,然后让所有接口都可以在任何模块和任何线程中使用数据。这就是为什么您需要将所有数据传输到一个可以包装托管对象的新 class。
所以假设您有一个名为 MyObject
的 class 和一个核心数据 class MyObjectEntity
,并且可能还有一本 API 的字典。然后 MyObject
的接口将是:
init(entity: MyObjectEntity) // Wraps the entity and copies all fields to this class
init(descriptor: [String: Any]) // Copies all fields to this class
var descriptor: [String: Any] // Returns a dictionary ready to be parsed to JSON
func writeToManagedObject() // Will copy all the data to managed object. If the object exists it will modify it, if not it will create a new one. This will not save the database.
通过一些子classing 和一些扩展,您可以创建一个非常好的系统,即使您有许多需要映射的模型。并且由于此 class 对从任何线程 and/or 进行访问完全不敏感,保存上下文它已准备好进行任何其他高级操作。据我所知,您甚至可以将其用作 MVVM。
使您的数据 class 在适当的时候发出 NSManagedObject subclass,并传递给具有 moc 的代码部分。对于程序的其余部分,只需处理您的非 MOC class。示例如下。
示例:
class MyMOCDataClass : NSManagedObject {
public var myName:String
public var myAge:Int16
}
class MyDataClass {
public var myName:String
public var myAge:Int16
init(...){
//whatever else you may or may not need to do here.
}
func emitWithMoc( moc: NSManagedObjectContext ) -> MyMOCDataClass {
var tmpMocClass = MyMOCDataClass( context: moc )
tmpMocClass.myName = self.myName
tmpMocClass.myAge = self.myAge
return tmpMocClass;
}