RestKit - 无法在我的tableView上显示JSON数据

时间:2013-11-09 08:36:04

标签: ios json uitableview restkit restkit-0.20

我使用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];

和我的tableViewController.m中的GET方法代码

-(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;
}

我是核心数据的新手,所以我不知道如何在get方法的Success Block中分配收到的数据。

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;
}

3 个答案:

答案 0 :(得分:1)

查看此链接https://github.com/RestKit/RestKit/blob/master/Docs/Object%20Mapping.md

在这里,您将了解如何使用Rest Kit处理Core数据。 希望它有所帮助,因为它对我有用......

答案 1 :(得分:0)

您无需将映射结果分配给任何内容。当您使用Core Data和实体映射时,在映射过程中,RestKit将为您更新并保存Core Data模型。

这一行:

self.fetchedResultsController = [mappingResult firstObject];

没有意义,因为映射结果包含Player类的实例。它也不是直接的数组。

您获取的结果控制器应该是标准配置(就像创建新项目时由Apple模板创建的配置一样)。这将自动观察模型并刷新表视图(由于模型更改时委托方法回调)。


获取MOC:

NSManagedObjectContext *moc = [[RKManagedObjectStore defaultStore] mainQueueManagedObjectContext];

答案 2 :(得分:-1)

使用此行代码

controller.managedObjectContext = managedObjectStore.mainQueueManagedObjectContext;

而不是

controller.managedObjectContext = self.managedObjectContext;

它将使您的上下文成为主队列上下文。试试吧!