1

我正在编写一个包含许多不同NSFetchedResultsController实例的应用程序,这些实例是在工厂方法中创建的。

现在我正在尝试根据控制器的属性(连接实体名称、谓词、排序信息......)为控制器创建一个缓存名称。

如果有人以前这样做过,请分享您的经验:

  • 这是一个好方法吗?
  • 我应该如何创建缓存名称?

作为一个侧面的想法:

我也想知道为什么 NSFetchedResultsControllers 实现本身还没有处理这个问题。为什么我要手动分配一些缓存名称,这似乎是一个容易出错的开销!或者我在这里错过了什么?

4

1 回答 1

1

我很惊讶,似乎没有人感兴趣。我猜想,每个处理大量动态创建的结果控制器的人都需要这个!

无论如何,这是我的解决方案:

// NSFetchedResultsController+GenericCache

- (id)initWithFetchRequest:(NSFetchRequest *)fetchRequest
      managedObjectContext:(NSManagedObjectContext *)context
        sectionNameKeyPath:(NSString *)sectionNameKeyPath
                  useCache:(BOOL)useCache {
    NSString *cacheId = nil;
    if (useCache) {
        cacheId = [NSString stringWithFormat:@"%@-%@-%@"
                   , sectionNameKeyPath
                   , [fetchRequest entityName]
                   , [[fetchRequest predicate] predicateFormat]];
        for (NSSortDescriptor *descriptor in [fetchRequest sortDescriptors]) {
            NSString *sortId = [NSString stringWithFormat:@"-%@-%@-%@"
                                , [descriptor key]
                                , ([descriptor ascending]) ? @"ascending": @"descending"
                                , NSStringFromSelector([descriptor selector])];
            cacheId = [cacheId stringByAppendingString:sortId];
        }
    }
    return [self initWithFetchRequest:fetchRequest
                 managedObjectContext:context
                   sectionNameKeyPath:sectionNameKeyPath
                            cacheName:cacheId];
}

- (void)deleteCache {
    [[self class] deleteCacheWithName:[self cacheName]];
}

我仍在测试,我非常愿意接受批评和改进建议。

请帮助使其可靠。

于 2013-09-01T08:51:32.817 回答