Когда инициировать загрузку исходных данных StackMob в приложение CoreData

Добрый день Всем

Я работаю над приложением, управляемым CoreData, которое начинается с пустого хранилища CoreData, которое я заполняю из приложения StackMob.

У меня есть подкласс UITableView, который извлекает и представляет мои данные так, как я хочу, но я немного озадачен тем, когда мне лучше всего получить исходные данные из StackMob. Когда я инициировал заполнение моего хранилища CoreData (из небольшого файла plist и только для тестирования представления) в applicationDidFinishLaunching, мое приложение потратило много времени на отображение экрана по умолчанию, и я ожидаю, что это будет еще дольше с реальными данными, полученными из Интернета. Я рассматриваю возможность изменения этого метода в моем подклассе UITableView...

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

    ...

    return _frc;
}

to...

- (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, Педро :)


person Pedro    schedule 30.08.2011    source источник
comment
Следуете ли вы одному из замечательных учебных пособий по основным данным, которые проведут вас через сквозной сценарий использования Xcode для определения схемы CoreData (например, cocoadevcentral.com/articles/000085.php) или вы получили свою структуру данных и просто работаете над интерфейсом кода?   -  person bmike    schedule 30.08.2011
comment
Мой код основан на примерах Apple и нескольких онлайн-руководствах (в том числе от Маркуса Зарры) и очень близок к тому, что предлагает ScanPlayGames ниже. Я отредактировал вопрос, чтобы сделать то, что я действительно спрашиваю, более ясным.   -  person Pedro    schedule 31.08.2011


Ответы (1)


Во-первых, создайте NSPredicate для извлечения вашей информации из Core Data (при условии, что в данном случае это NSSet):

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

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

Затем создайте контроллер результатов выборки, используя предикат

// 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];
}
person Delete    schedule 30.08.2011
comment
Я делаю все это (за исключением того, что у меня нет предиката, потому что мне нужны все элементы в сущности, которую я запрашиваю), и это работает, когда у меня есть данные. Он также работает без данных и отображает пустой UITableView. Моему приложению необходимо загрузить некоторые данные из StackMob при первом запуске, и когда это произойдет, это то, о чем был мой вопрос. Я отредактирую вопрос, чтобы сделать это более ясным. - person Pedro; 30.08.2011
comment
Спасибо за попытку помочь. Я отредактировал вопрос и взял его на подбородок за то, что он недостаточно ясен для начала. - person Pedro; 30.08.2011