我有一个问题:)我经常遇到我有一些对象(书籍说)和用户列表的情况。每个用户都有一些书。还有一个当前登录用户的特殊情况,其具有比普通用户更多的属性(发布权限,收藏夹)等。
在之前的所有项目中,我一直在创建User的子类,名为CurrentUser,并在其中添加当前用户属性/逻辑(例如,普通用户无法注销)。但我总是遇到确保只存在一个CurrentUser对象的问题。
其他人如何做到这一点?我正确地做到了吗?
答案 0 :(得分:0)
我不太确定我理解你的问题,但如果你想控制CurrentUser
只有一个实例,我会设置一种单身类,比如说SessionController
,具有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