我有一个由 NSFetchedResultsController 管理的表视图。但是,我遇到了查找或创建操作的问题。当用户点击我的表格视图的底部时,我正在向我的服务器查询另一批内容。如果它在本地缓存中不存在,我们创建它并存储它。但是,如果它确实存在,我想将该数据附加到获取的结果控制器并显示它。我无法完全弄清楚那部分。
到目前为止,这是我正在做的事情:
- NSFetchedRequestController 初始化查询数据库中最新的 100 个结果时(使用
setFetchLimit:
)。即使有 1000 行,我也只希望一开始可以访问 100 行。 - 将返回的值数组从我的服务器传递到 NSOperation 进行处理。
- 在操作中,创建一个新的托管对象上下文来使用。
- 在操作中,我遍历数组并执行获取请求以查看对象是否存在(基于其服务器 id)。
- 如果对象不存在,我们创建它并将其插入到操作的托管对象上下文中。
- 迭代完成后,我们保存托管对象上下文,这会在我的主线程上触发合并通知。
在合并期间,将步骤 4 中新创建的对象插入到表中,但任何已经存在且刚刚获取的对象都不会插入。这是我的 NSOperation 中的相关代码
for (NSDictionary *resultsDict in self.results)
{
NSNumber *dbID = [NSNumber numberWithLong:[[resultsDict valueForKey:@"id"] longValue]];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:[NSEntityDescription entityForName:kResultEntityName inManagedObjectContext:moc]];
[fetchRequest setPredicate:[NSPredicate predicateWithFormat: @"(dbID == %@)", dbID]];
NSError *error = nil;
NSManagedObject *newObject = nil;
// Query the data store to see if the object exists
newObject = [[moc executeFetchRequest:fetchRequest error:&error] lastObject];
[fetchRequest release];
// If it doesn't exist, create it.
if ((tweet == nil))
{
// Create the NSManagedObject and insert it into the MOC.
}
}
我想传递给我的主线程的是新创建的对象以及每次循环迭代时可能在获取请求中获取的任何现有对象。
我觉得这是我所缺少的一些简单的东西,并且可以在正确的方向上使用轻推。