RestKit - не удалось отобразить данные JSON в моем tableView

Я использую Rest Kit 0.20.3 и Xcode 5 с основными данными. Я получил данные JSON со своего сервера, но не могу отобразить их на контроллере tableView.

Вот код сопоставления и дескриптора ответа в AppDelegate.m

RKEntityMapping *playerMapping = [RKEntityMapping mappingForEntityForName:@"Player" inManagedObjectStore:managedObjectStore];

    [playerMapping addAttributeMappingsFromDictionary:@{@"id": @"playerID",
                                                        @"name": @"playerName",
                                                        @"age": @"playerAge",
                                                        @"created_at": @"createdAt",
                                                        @"updated_at": @"updatedAt"}];

    RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:playerMapping method:RKRequestMethodGET pathPattern:@"/players.json" keyPath:nil statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];

    [objectManager addResponseDescriptor:responseDescriptor];

и мой код для метода GET в моем tableViewController.m

-(void)loadPlayers{
    [[RKObjectManager sharedManager] getObjectsAtPath:@"/players.json" parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult){
        [self.refreshControl endRefreshing];
        NSLog(@"IT WORKED!");
        self.fetchedResultsController = [mappingResult firstObject];
    }failure:^(RKObjectRequestOperation *operation, NSError *error){
        NSLog(@"FAILED TO PERFORM GET");
    }];
}

и код для cellForRowAtIndexPath:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];

    Player *player = [self.fetchedResultsController objectAtIndexPath:indexPath];
    cell.textLabel.text = player.playerName;
    return cell;
}

Я новичок в основных данных, поэтому у меня нет идеи о том, как назначить полученные данные в Success Block метода get.

код для FRC:

- (NSFetchedResultsController *)fetchedResultsController
{
    if (_fetchedResultsController != nil) {
        return _fetchedResultsController;
    }

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    // Edit the entity name as appropriate.
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Player" inManagedObjectContext:self.managedObjectContext];
    [fetchRequest setEntity:entity];

    // Set the batch size to a suitable number.
    [fetchRequest setFetchBatchSize:20];

    // Edit the sort key as appropriate.
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"playerName" ascending:NO];
    NSArray *sortDescriptors = @[sortDescriptor];

    [fetchRequest setSortDescriptors:sortDescriptors];

    // Edit the section name key path and cache name if appropriate.
    // nil for section name key path means "no sections".
    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:@"Master"];
    aFetchedResultsController.delegate = self;
    self.fetchedResultsController = aFetchedResultsController;

    NSError *error = nil;
    if (![self.fetchedResultsController performFetch:&error]) {
         // Replace this implementation with code to handle the error appropriately.
         // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }

    return _fetchedResultsController;
}

person Ashish Beuwria    schedule 09.11.2013    source источник


Ответы (3)


Используйте эту строку кода

controller.managedObjectContext = managedObjectStore.mainQueueManagedObjectContext;

Вместо

controller.managedObjectContext = self.managedObjectContext;

Это сделает ваш контекст основным контекстом очереди. Попробуй это!

person Amaresh    schedule 09.11.2013
comment
Спасибо! Amaresh это сработало, но он по-прежнему показывает дескриптор сортировки как нулевой, например: <NSFetchRequest: 0x8d77d40> (entity: Player; predicate: (playerID == 33); sortDescriptors: ((null)); type: NSManagedObjectResultType; ) - person Ashish Beuwria; 09.11.2013

посмотрите на эту ссылку https://github.com/RestKit/RestKit/blob/master/Docs/Object%20Mapping.md

И здесь вы узнаете, как работать с базовыми данными с помощью Rest Kit. Надеюсь, это поможет, как это сработало для меня...

person Vizllx    schedule 09.11.2013
comment
Я не думаю, что у меня проблемы с отображением. Так помогает? - person Ashish Beuwria; 09.11.2013
comment
@AshishBeuwria, вы можете проверить основные данные раздела, где вы получите код, необходимый для вашей проблемы ... - person Vizllx; 09.11.2013

Вам не нужно присваивать результат сопоставления чему-либо. Когда вы используете Core Data и сопоставление сущностей, модель Core Data будет обновлена ​​и сохранена RestKit для вас в процессе сопоставления.

Эта строка:

self.fetchedResultsController = [mappingResult firstObject];

Не имеет смысла, потому что результат сопоставления содержит экземпляры класса Player. Это также не является непосредственно массивом.

Ваш полученный контроллер результатов должен иметь стандартную конфигурацию (такую ​​же, как та, которая создается шаблоном Apple при создании нового проекта). Это автоматически наблюдает за моделью и обновляет табличное представление (из-за обратных вызовов метода делегата при изменении модели).


Получите MOC с помощью:

NSManagedObjectContext *moc = [[RKManagedObjectStore defaultStore] mainQueueManagedObjectContext];
person Wain    schedule 09.11.2013
comment
Я удалил эту строку, но она все равно не работает. Могу ли я что-нибудь сделать с cellForRowAtIndexPath - person Ashish Beuwria; 09.11.2013
comment
Покажите, как вы создаете FRC, отлаживаете обратные вызовы делегата FRC, отображаются ли в таблице какие-либо строки? - person Wain; 09.11.2013
comment
Я. Он показывает tableView, но пустой, и я отредактировал свой вопрос. Так что взгляните на FRC. - person Ashish Beuwria; 09.11.2013
comment
Выглядит разумно. Я бы удалил кеш (хотя сейчас это не должно быть проблемой). Как устанавливается self.managedObjectContext? Он существует? Вы получаете его из RestKit? Это основной контекст очереди? - person Wain; 09.11.2013
comment
Удалить кеш, вы имеете в виду из AppDelegate? И я объявил managedObjectContext как свойство в заголовочном файле tableViewController. Я создал MOC, как вы сказали мне здесь - person Ashish Beuwria; 09.11.2013
comment
Я имею в виду кеш на FRC. Добавление свойства не устанавливает его значение. Вам необходимо получить контекст основной очереди из хранилища управляемых объектов. - person Wain; 09.11.2013
comment
Как я могу это сделать? И я думаю, что есть проблема с дескриптором сортировки, потому что он показывает (ноль) для всех идентификаторов игроков, например, <NSFetchRequest: 0x8d77d40> (entity: Player; predicate: (playerID == 33); sortDescriptors: ((null)); type: NSManagedObjectResultType; )' - person Ashish Beuwria; 09.11.2013
comment
Что за запрос на получение? Почему у него есть предикат? - person Wain; 09.11.2013
comment
это тот же запрос на выборку, что и в FRC, и я не указал никаких предикатов. Я не знаю, как он принимает значение предиката - person Ashish Beuwria; 09.11.2013