带有 MagicalRecord 庞大数据集的 UItableView

Posted

技术标签:

【中文标题】带有 MagicalRecord 庞大数据集的 UItableView【英文标题】:UItableView with MagicalRecord huge data set 【发布时间】:2015-11-04 16:41:03 【问题描述】:

我有一个存储一些数据的表。假设数据太大而无法一次全部加载到内存中。我想在 UItableView 中显示这些数据。

-(NSInteger) numberOfSectionsInTableView:(UITableView *)tableView

   return 1;


-(NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

   return  [Item MR_numberOfEntities];


-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath


   UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];


// How to get object for this row ???


return cell;


我知道的唯一方法是将所有数据加载到数组中

NSArray *items = [Item MR_findAll];

但我不想那样做。用户将显示前 10 行,我为什么要从 CoreData 加载所有这些行。有什么方法可以使用 MagicalRecord 来一一获取吗?

【问题讨论】:

这个答案很旧(从那时起,MagicalRecord 发生了很大变化),但您可以使用自定义提取设置 fetchLimit:github.com/magicalpanda/MagicalRecord/issues/283 @Yegor Razumovsky 根据您的要求更新了我的答案! 如果你不能用NSFetchedResultsController和MR,我建议转储MR。 你能和 MR 分享关于 NSFetchedResultsController 的 sime 链接吗,我真的很想知道如何让事情变得正确。顺便说一句,请告诉我上面的答案 - 是否正确? 如果有帮助,请接受我的回答。建议你转储MR,。作为替代方案考虑使用 Realm DB。它为您提供了更大的灵活性、使用简单性和丰富的 api。 【参考方案1】:

根据docs,您需要初始化获取请求,并且您可能希望根据滚动进度设置获取偏移量。但您必须手动跟踪它。这是如何实现它的基本方法。 PS。我没有测试过这段代码。我只是在文本编辑器中写的:)。但它应该按您的要求工作。例如加载限制为 10 的项目。

    @property (nonatomic) int itemCount;

    @property (nonatomic, strong)  NSMutableArray * items 

    static const int FETCH_LIMIT = 10;


       -(NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
       
        return  _itemCount;
       

        - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
        
            // Classic start method
            static NSString *cellIdentifier = @"MyCell";
            MyCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
            if (!cell)
            
                cell = [[MyCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MainMenuCellIdentifier];
            

            MyData *data = [self.itemsArray objectAtIndex:indexPath.row];
            // Do your cell customisation
            // cell.titleLabel.text = data.title;

            if (indexPath.row == _itemCount - 1)
            
                [self loadMoreItems];
            
        

    -(void)loadMoreItems

      int newOffset = _itemCount+FETCH_LIMIT; // Or _itemCount+FETCH_LIMIT+1 not tested yet

      NSArray * newItems = [self requestWithOffset: newOffset];

     if(!newItems || newItems.count == 0)

        // Return nothing since All items have been fetched

       return;
     

      [ _items addObjectsFromArray:newItems ];
    // Updating Item Count
      _itemCount = _items.count;

    // Updating TableView
       [tableView reloadData];
    

    -(void)viewDidLoad

     [super viewDidLoad];
          _items = [self requestWithOffset: 0];
          _itemCount =  items.count;
    

    -(NSArray*)requestWithOffset: (int)offset

          NSFetchRequest *itemRequest = [Item MR_requestAll];
          [itemRequest setFetchLimit:FETCH_LIMIT]
          [itemRequest setFetchOffset: offset]
          NSArray *items = [Item MR_executeFetchRequest:itemRequest];
       return items;
     

希望对您有所帮助:)

【讨论】:

以上是关于带有 MagicalRecord 庞大数据集的 UItableView的主要内容,如果未能解决你的问题,请参考以下文章

带有 MagicalRecord 和多个商店的 AFIncrementalStore

带有 MagicalRecord 和 NSURLRequests 的 NSOperationQueues

带有primaryRelationshipKey的MagicalRecord

带有 UITableView 示例的 MagicalRecord

具有庞大数据集的数据库结构的建议

带有 MagicalRecord 的 JSONModel