2015-11-04 72 views
0

我有一個存儲一些數據的表。假設數據太大而無法一次加載到內存中。我想在UItableView中顯示這些數據。帶有MagicalRecord巨大數據集的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一個接一個地獲取它們?

+0

這個答案是舊的(和MagicalRecord從那時起一個很大的變化),但你可以把fetchLimit使用自定義獲取: https://github.com/magicalpanda/MagicalRecord/issues/283 – Larme

+0

@Yegor Razumovsky根據您的要求更新了我的答案! – ProblemSlover

+0

如果你不能在MR中使用'NSFetchedResultsController',我建議將MR丟棄。 – Avi

回答

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; 
    } 

如加載項希望你能有所幫助:)

相關問題