我试图让我的类'User'成为NSManagedObject并同时成为sharedInstance。但是,当我调用[User sharedInstance]
时,我得到 CoreData:错误:无法在NSManagedObject类“User”上调用指定的初始值设定项。
将NSManagedObject视为常规NSObject并且在其上具有自定义属性和方法是否可以?
User.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;
User.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;
}
答案 0 :(得分:1)
我认为托管对象和单例习语混合得很好。他们也服务于一个本质上不同的目的,也许这就是原因。
您需要从应用中的任何位置访问当前用户。这是一个非常常见的用例。经过充分测试和清理的方法是保留对app delegate(或您的Core Data堆栈类)中对象的引用。我个人更喜欢在NSUserDefaults
中存储一些唯一ID,并从类或应用代理动态返回currentUser
。
请注意,如果您使用背景上下文,您可能需要相同“当前用户”的多个实例(单身模式不适合的另一个原因)。一种方便的方法是使用class
方法获取上下文和唯一标识符,并返回相应的User
对象。
答案 1 :(得分:0)
查看NSManagedObject
的{{3}}
重要事项此方法是指定的初始值设定项 NSManagedObject。您不能简单地初始化托管对象 发送它。