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 数据的主要内容,如果未能解决你的问题,请参考以下文章
RestKit iOS 教程 - Xcode 无法识别 RestKit 类方法 - 缺少框架?
无法让自定义 RKBlockValueTransformer 与 RestKit 一起正常工作