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

G'day All

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

Iу меня есть подкласс UITableView, который выбирает и представляет мои данные так, как я хочу, но я немного озадачен тем, когда мне лучше всего получить исходные данные из StackMob.Когда я запустил заполнение своего хранилища CoreData (из небольшого plist-файла и только для проверки представления) в applicationDidFinishLaunching, мое приложение потратило много времени на отображение экрана по умолчанию, и я ожидаю, что с реальными данными, полученными из Интернета, будет еще больше времени.Я подумываю об изменении этого метода в моем подклассе 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.

Cheers & TIA, Pedro:)

1 Ответ

1 голос
/ 30 августа 2011

Сначала создайте 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];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...