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

Posted

技术标签:

【中文标题】RestKit - 无法在我的 tableView 上显示 JSON 数据【英文标题】:RestKit - Not been able to display JSON data onto my tableView 【发布时间】: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;

【问题讨论】:

【参考方案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; )

以上是关于RestKit - 无法在我的 tableView 上显示 JSON 数据的主要内容,如果未能解决你的问题,请参考以下文章

无法在我的 TableView 中显示自定义单元格文件?

RestKit iOS 教程 - Xcode 无法识别 RestKit 类方法 - 缺少框架?

RestKit 0.20 无法从服务器获取数据

无法让自定义 RKBlockValueTransformer 与 RestKit 一起正常工作

使用 RestKit 映射的 JSON Post 后 TableView 不刷新

在 Xcode 中设置 RestKit