何时触发将StackMob初始数据下载到Core Data应用程序

时间:2011-08-30 18:33:29

标签: iphone ios core-data stackmob

G'全部

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

我有一个UITableView的子类,它取出&按照我的要求提供我的数据,但我有点困惑于何时最好从StackMob获取初始数据。当我在applicationDidFinishLaunching中触发填充我的CoreData商店(来自一个小的plist文件并且仅用于测试视图)时,我的app花了很长时间显示默认屏幕&我希望从网上获取真实数据会更长。我正在考虑在我的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进行核对,因为我正在从实体中获取所有数据。

采取好的方法吗?如果不是更好的方法呢?

我希望能够提供一种用户体验,就像我在某些应用中看到过的用户体验一样,这些应用会出现在' home'屏幕,因为它是下载&添加到CoreData商店。

干杯& TIA,佩德罗:)

1 个答案:

答案 0 :(得分: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];
}