【问题标题】:RestKit - Not been able to display JSON data onto my tableViewRestKit - 无法在我的 tableView 上显示 JSON 数据
【发布时间】:2013-11-09 08:36:04
【问题描述】:

我正在使用带有核心数据的 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;
}

【问题讨论】:

    标签: ios json uitableview restkit restkit-0.20


    【解决方案1】:

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

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

    【讨论】:

    • 我认为我在映射方面没有问题。那么它有帮助吗?
    • @AshishBeuwria 你可以查看部分核心数据,在那里你可以根据需要获取代码来解决你的问题......
    【解决方案2】:

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

    这一行:

    self.fetchedResultsController = [mappingResult firstObject];
    

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

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


    通过以下方式获取 MOC:

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

    【讨论】:

    • 我已经删除了该行,但它仍然不起作用。有什么我可以用cellForRowAtIndexPath
    • 展示如何创建 FRC,调试 FRC 委托回调,表格是否显示任何行?
    • 是的,它显示了 tableView,但是一个空白的,我已经编辑了我的问题。所以看看 FRC。
    • 看起来很明智。我会删除缓存(尽管现在应该不是问题)。 self.managedObjectContext 是怎么设置的?它存在吗?你是从 RestKit 得到的吗?它是主队列上下文吗?
    • 删除缓存,你的意思是来自 AppDelegate?我已经将managedObjectContext 声明为tableViewController 头文件中的一个属性。正如你告诉我的那样,我创建了 MOC here
    【解决方案3】:

    使用这行代码

    controller.managedObjectContext = managedObjectStore.mainQueueManagedObjectContext;
    

    代替

    controller.managedObjectContext = self.managedObjectContext;
    

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

    【讨论】:

    • 谢谢! Amaresh 它起作用了,但它仍然将排序描述符显示为 null,如下所示:<NSFetchRequest: 0x8d77d40> (entity: Player; predicate: (playerID == 33); sortDescriptors: ((null)); type: NSManagedObjectResultType; )
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-13
    • 1970-01-01
    • 1970-01-01
    • 2016-07-01
    • 1970-01-01
    • 2020-03-28
    相关资源
    最近更新 更多