我试图让我的类'User'成为NSManagedObject并同时成为共享实例。但是,当我调用我的[User sharedInstance]
时,我收到 CoreData:错误:无法在 NSManagedObject 类"User"上调用指定的初始值设定项。
是否可以像对待常规 NSObjects 一样对待 NSManagedObject,并在其上具有自定义属性和方法?
用户.h
@interface User : NSManagedObject
@property (nonatomic, retain) NSString *Id;
@property (nonatomic, retain) NSString *lastName;
@property (nonatomic, retain) NSString *firstName;
@property (nonatomic, assign) BOOL isLoggedIn;
+ (instancetype)currentUser;
用户.m
@synthesize Id;
@synthesize lastName;
@synthesize firstName;
@synthesize isLoggedIn;
+ (instancetype)currentUser {
static id sharedInstance = nil;
static dispatch_once_t t;
dispatch_once(&t, ^{
sharedInstance = [[self alloc] init];
});
return sharedInstance;
}
我认为托管对象和单例习惯用法不能很好地混合。它们也有本质上不同的目的,也许这就是原因。
您需要从应用程序中的任何位置访问当前用户。这是一个非常常见的用例。一个经过充分测试且干净的方法是在应用委托(或核心数据堆栈类)中保留对对象的引用。我个人更喜欢只在NSUserDefaults
中存储一些唯一的 ID,并从类或应用程序委托动态返回currentUser
。
请注意,如果您使用后台上下文,则可能需要同一"当前用户"的多个实例(单例模式不适合的另一个原因)。一种方便的方法是使用一个 class
方法,该方法采用上下文和唯一标识符并返回相应的User
对象。
查看 NSManagedObject
的文档 - initWithEntity:insertIntoManagedObjectContext:
重要说明 此方法是指定的初始值设定项 NSManagedObject.不得仅通过 发送它初始化。