另一个CoreData获取优化

时间:2013-04-11 04:10:55

标签: objective-c xcode core-data query-optimization nsfetchedresultscontroller

我有一个“产品”实体的数据库,大约有4万到5万个条目。我有一个视图,允许用户滚动实体表(我知道糟糕的设计,但这是客户想要的)。

产品”实体如下所示:

**Product:** 
     - part_number (string) (indexed)
     - list_price (string)
     - manufacturer_partNumber (string)
     - productDescription (string)
     - productID (string)
     • inventory (NSManagedObject, 1..n)
         - name (string)
         - quantity (string)
     • manufacturer (NSManagedObject, 1..1)
         - name (string)
         - manufacturerID (string)

首先,我以标准方式创建NSFetchedResultsController,返回所有产品实体,并在part_number上设置排序描述符。我跳过了所有的箍,试图加快抓取:

  1. fetchBatchSize
  2. 索引属性
  3. EXPLAIN QUERY
  4. 这样做我只能得到大约~3.5分钟。不好。

    所以从EXPLAIN QUERY我看到花了很多时间来获取inventorymanufacturer个实体。合理但仍然不好。所以我决定只返回 Product 实体的一些属性,而不是返回那些属性。

    以下是我使用setPropertiesToFetch

    获取的属性
     - part_number (string) (indexed)
     - list_price (string)
     - photo (string)
     - productID (string)
    

    part_number上设置了排序描述符,其中fetchBatchSize为15.这将获取时间缩短到约40秒。仍然不好。


    我知道有人会在这里问我是如何设置NSFetchedResultsController

    - (NSFetchedResultsController *)fetchedResultsControllerWithCacheName:(NSString*)cacheName {
    
        [NSFetchedResultsController deleteCacheWithName:cacheName];
    
        NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
        NSEntityDescription *entity = [NSEntityDescription
                                       entityForName:@"Product" inManagedObjectContext:self.managedObjectContext];
        [fetchRequest setEntity:entity];
    
        NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"part_number" ascending:YES];
        [fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];
    
        [fetchRequest setFetchBatchSize:15];
    
        [fetchRequest setResultType:NSDictionaryResultType];
        [fetchRequest setReturnsDistinctResults:YES];
        [fetchRequest setPropertiesToFetch:@[@"part_number", @"list_price", @"photo", @"productID"]];
    
        NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                                                                                      managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil
                                                                                                                 cacheName:cacheName];
    
        return theFetchedResultsController;
    }
    

    我可以做任何其他来加快速度吗?

    我有一个想法可能真的很hacky是使用NSFetchedResultsController进行某种类型的延迟加载(是的,我知道它假设要处理它)。我没有完全考虑过这一点,但是设置setFetchLimit说100并使用NSPredicate在最后part_number之后加载内容。这可能只是耗时。

0 个答案:

没有答案