1

G'day 全部

我正在开发一个 CoreData 驱动的应用程序,该应用程序从我从StackMob应用程序填充的空 CoreData 存储开始。

我有一个 UITableView 的子类,它可以按我的意愿获取和呈现我的数据,但我有点困惑什么时候最好从 StackMob 获取初始数据。当我在 applicationDidFinishLaunching 中触发填充我的 CoreData 存储(从一个小的 plist 文件并且仅用于测试视图)时,我的应用程序花了很长时间显示默认屏幕,我希望从网络获取的真实数据会更长。我正在考虑在我的 UITableView 子类上更改此方法...

- (NSFetchedResultsController *)frc
{
    if (_frc) return _frc;

    ...

    return _frc;
}

至...

- (NSFetchedResultsController *)frc
{
    if (_frc) return _frc;

    ...

    if ([[_frc fetchedObjects] count] == 0) {
        // Spawn NSOperation to get initial data from StackMob.
        // & use it to populate my CoreData store.
    }

    return _frc;
}

在这种情况下,我会将 NSOperation 设为一个子类,我可以将其重新用于后续数据更新。我正在检查,[[_frc fetchedObjects] count] == 0因为我正在从实体中获取所有数据。

是一个好的方法吗?如果不是什么是更好的方法?

我希望提供一种用户体验,就像我在我使用的某些应用程序中看到的那样,当项目被下载并添加到 CoreData 商店时,项目出现在“主”屏幕上。

干杯和 TIA,佩德罗 :)

4

1 回答 1

1

首先,创建一个 NSPredicate 以从 Core Data 中获取您的信息(假设它是一个 NSSet,在这种情况下):

NSMutableSet yourMutableDataSetYouGotFromCoreData = [self.yourCoreDataObject mutableSetValueForKey:@"yourCoreDataSetData"];

NSPredicate *yourDataFilter = [NSPredicate predicateWithFormat:@"SELF IN %@",yourMutableDataSetYouGotFromCoreData];

接下来,使用谓词创建您的 fetche 结果控制器

// Fetched results controller
NSFetchedResultsController *yourFetchedResults = [YOURCOREDATAOBJECT fetchRequestAllGroupedBy:nil 
                                                                                                withPredicate:supplyRegisterFilter];

接下来,将此信息提供给您的表

[self.yourTable updateTableData:yourFetchedResults];

现在,在您的表格中,您可以在其中创建单元格数据内容 - 使用类似这样的内容从获取的结果控制器中获取数据

-(void) updateTableData:(NSFetchedResultsController*)fetched
{
       self.fetchedResultsController = fetched;

       if(self.fetchedResultsController)
          [self.tableView reloadData];

 }


-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [self.fetchedResultsController.fetchedObjects count];
}


- (UITableViewCell *)tableView:(UITableView *)tableView 
     cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    YourCustomCellType *cell = (YourCustomCellType *)    [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

    if (!cell)
    {
        NSArray *topLevelItems = [cellLoader instantiateWithOwner:self options:nil];
        cell = [topLevelItems objectAtIndex:0];
    }

    [self configureCellData atIndexPath:indexPath];

    return cell;
}

- (void) configureCellData:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath
{
    YourCustomCellType *customCell = (YourCustomCellType *)cell;
    id obj = [[fetchedResultsController fetchedObjects] objectAtIndex:indexPath.row];
    [customCell setCellDataFromId:obj];
}
于 2011-08-30T19:29:26.630 回答