我有一个问题:) 我经常遇到我有一些对象(书籍说)和用户列表的情况。每个用户都有一些书籍。还有一种特殊情况是当前登录的用户比普通用户拥有更多的属性(发帖权限、收藏夹)等。
在所有以前的项目中,我一直在创建一个名为 CurrentUser 的 User 子类,并在其中添加当前用户属性/逻辑(例如,普通用户无法注销)。但我总是遇到确保只有一个 CurrentUser 对象存在的问题。
其他人如何做到这一点?我这样做正确吗?
我有一个问题:) 我经常遇到我有一些对象(书籍说)和用户列表的情况。每个用户都有一些书籍。还有一种特殊情况是当前登录的用户比普通用户拥有更多的属性(发帖权限、收藏夹)等。
在所有以前的项目中,我一直在创建一个名为 CurrentUser 的 User 子类,并在其中添加当前用户属性/逻辑(例如,普通用户无法注销)。但我总是遇到确保只有一个 CurrentUser 对象存在的问题。
其他人如何做到这一点?我这样做正确吗?
我不太确定我是否理解您的问题,但是如果您想控制只有一个实例,CurrentUser
我将设置一种单例类,例如SessionController
,它具有 type 的属性CurrentUser
。
因此,您可以在任何地方访问该属性,并且您知道它只有该类的一个实例可用,因此您当前的用户只有一个属性。
CurrentUser* cu = [[SessionController sharedSessionController] currentUser];
if(!cu) // allowed
else // not allowed
当您登录(或其他)时,您会填充该属性。注销时,将其设置为零。当您想与其他用户一起进入时,您可以检查该属性。这是一种在大多数情况下都可以使用的简单方法。
关于您的问题,我不太确定您为什么将User
实体子类化。但也许有一些动机。处理子类时要注意。实际上,如果您使用 sqlite 存储,Core Data 会在底层实现您创建的子类的扁平化。因此,在您的情况下,您只有一个User
具有您在中创建的属性的表CurrentUser
。
编辑
阅读您的问题的标题,如果必须使用 db 文件进行控制,我将创建一个名为LoggedUser
并避免使用子类的实体。
在这里,您可以存储当前用户的 id 和您想要的其他属性。
然后,如果您想验证是否有一个用户已经登录,您可以简单地设置如下请求:
NSInteger count = [fetchRequest countForFetchRequest:&error]; // query against `LoggedUser`
if(count >= 1) // not allowed
else // allowed