NSManagedObject sharedInstance



我试图让我的类'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.不得仅通过 发送它初始化。

最新更新