NSManagedObject sharedInstance

时间:2016-02-07 06:20:29

标签: ios core-data singleton nsmanagedobject nsobject

我试图让我的类'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;
}

2 个答案:

答案 0 :(得分:1)

我认为托管对象单例习语混合得很好。他们也服务于一个本质上不同的目的,也许这就是原因。

您需要从应用中的任何位置访问当前用户。这是一个非常常见的用例。经过充分测试和清理的方法是保留对app delegate(或您的Core Data堆栈类)中对象的引用。我个人更喜欢在NSUserDefaults中存储一些唯一ID,并从类或应用代理动态返回currentUser

请注意,如果您使用背景上下文,您可能需要相同“当前用户”的多个实例(单身模式不适合的另一个原因)。一种方便的方法是使用class方法获取上下文和唯一标识符,并返回相应的User对象。

答案 1 :(得分:0)

查看NSManagedObject的{​​{3}}

的文档
  

重要事项此方法是指定的初始值设定项   NSManagedObject。您不能简单地初始化托管对象   发送它。