我正在努力使我的类“用户”同时成为NSManagedObject和sharedInstance。但是,当我调用我的[User sharedInstance]时,我得到了CoreData: error:未能调用NSManagedObject类上指定的'User'初始化器。
是否可以将NSManagedObject视为常规NSObjects,并在其上具有自定义属性和方法?
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;
}发布于 2016-02-07 09:38:17
我不认为托管对象和单例习语混合得很好。它们也有着本质上不同的目的,也许这就是原因。
您需要从应用程序中的任何地方访问当前用户。这是一个非常常见的用例。一个经过良好测试和清理的方法是在app委托(或您的Core数据堆栈类)中保留对对象的引用。我个人更喜欢在NSUserDefaults中存储一些惟一的ID,然后动态地从类或应用程序委托返回一个currentUser。
请注意,如果使用背景上下文(单例模式不适合的另一个原因),则可能需要同一“当前用户”的多个实例。一种方便的方法是有一个class方法,它接受上下文和唯一标识符,并返回适当的User对象。
发布于 2016-02-07 06:43:03
看一下NSManagedObject的- initWithEntity:insertIntoManagedObjectContext:文档。
重要的是,此方法是指定的NSManagedObject初始化程序。不能仅仅通过发送init来初始化托管对象。
https://stackoverflow.com/questions/35250408
复制相似问题