我应该在iPhone上预先获取所有核心数据实体吗?

时间:2010-09-03 01:10:43

标签: iphone core-data chat

我正在构建一个具有chatView的社交应用。消息是一个实体。在usersViewController(rootViewController)上,我想只显示每个用户的未读消息数。但是在chatView上,我想显示我和所选用户之间发送的消息。

我应该如何从Core Data中获取消息?

  1. 有没有办法将它们全部提取到一个NSMutableDictionary中,其中userIds作为键,每个指向一个消息实体的NSMutableArray?或者,我是否必须获取所有消息,然后使用Objective-C迭代它们以按照描述进行排列?

  2. 无论哪种方式,我应该在appDelegate中预先加载它们吗?或者,我应该只在查看相应的chatView时加载特定会话的消息吗?

  3. 要获取未读计数,我是否应该遍历已获取的Message实体,以使用户ID密钥的NSMutableDictionary指向计数值?或者,我应该创建一个类似于按userId分组的SQL求和查询的谓词(甚至可以使用Core Data吗?)?

  4. 我应该创建一个模型,称之为UnreadMessageCount,它存储了每个用户的未读消息数以及对User模型的引用?我希望在应用程序的第一页上包含所有未读消息,这样可以加快查询速度。但接收消息会比较慢,因为我不仅要将它添加到Message模型中,而且还要在UnreadMessageCount模型中增加该用户的计数。此外,数据有点复制。此外,我只会在每次启动应用程序时对所有消息计数进行查询,但每次收到新消息时我都会进行查询以更新未读消息计数,而不是在该用户的chatView页面上。

  5. 请填写我的iPhone内存管理&核心数据可能性和性能。另外,请对您的工程设计提出最佳意见。

    谢谢!

    马特

2 个答案:

答案 0 :(得分:3)

要获取消息计数,我会询问托管对象上下文,以获取给定特定提取请求的消息计数,例如,计算某个用户的消息:

NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Message" inManagedObjectContext:context];
[request setEntity:entity];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"user == %@", user];
[request setPredicate:predicate];

NSInteger count = [context countForFetchRequest:request error:nil];

这里我假设Message实体与user关系。

要获取同一用户的实际消息,我只需替换最后一行:

NSArray *messages = [context executeFetchRequest:request error:nil];

答案 1 :(得分:0)

当您使用CoreData时,iPhone通常可以很好地管理资源(特别是在您的示例中简单的结构)。所以为了回答你的问题,我认为你应该这样做:

  1. 您需要获取所有用户,然后遍历它们并创建指向每个messages实体的user属性的字典键
  2. 您不应该使用NSFetchedResultsController,而是有效地加载所请求的实体,并在表格视图中执行所有必需的预取以优化显示
  3. 上面的答案可能就是计算的方法。在您的实体上创建适当的索引将使它快速闪电。