如何在 segue 中从 CoreData 获取结果

Posted

技术标签:

【中文标题】如何在 segue 中从 CoreData 获取结果【英文标题】:How to fetch results from CoreData in a segue 【发布时间】:2013-07-03 04:47:18 【问题描述】:

我有一个使用 CoreData 和 Restkit 0.20 的 ios 应用程序。主视图控制器是一个集合视图,由使用 Restkit 对我的服务器的请求填充。对服务器的请求返回要放置在每个单元格中的图像和标题。如果用户选择了一个单元格,我需要向服务器发出第二个请求,以获取有关所选单元格的详细信息。

我花了一个晚上尝试在prepareForSegue 方法中完成此任务。问题是我似乎无法弄清楚如何从prepareForSegue 中发生的请求中获取结果。

这里是prepareForSegue 方法

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

    if ([[segue identifier] isEqualToString:@"newsDetail"]) 

// I USE THIS PORTION TO GET DATA THAT IS NEEDED FOR THE GET REQUEST TO THE SERVER AND TO PASS SOME ADDITIONAL ITEMS FROM THE FIRST REQUEST TO THE DETAIL VIEW CONTROLLER
        NSIndexPath *indexPath = [[self.collectionView indexPathsForSelectedItems] lastObject];
        NSManagedObject *object = [[self fetchedResultsController] objectAtIndexPath:indexPath];
        NSString *articleID =[object valueForKey:@"gistID"];
        NSString *personID = [object valueForKey:@"userID"];

// I USE THIS LINE TO ASSEMBLE THE STRING FOR getObjectsAtPath BELOW
        NSString *getArticle =[NSString stringWithFormat:@"/rest/article/getArticleForView?aid=%@&pid=%@&ip=255.255.255.0",articleID,personID];

//HERE I MAKE THE CALL TO THE SERVER USING RESTKIT METHODS        
        [[RKObjectManager sharedManager] getObjectsAtPath:getArticle parameters:nil success:nil failure:nil];    

        [[segue destinationViewController] setDetailItem:object];
    

这是我在详细视图控制器中加载它的方式。

- (void)configureView

    if (self.detailItem) 
        self.newsDetailText.text = [[self.detailItem valueForKey:@"fullArticle"]description];
        NSURL *photoURL =[NSURL URLWithString:[self.detailItem valueForKey:@"imageUrl"]];
        NSData *photoData = [NSData dataWithContentsOfURL:photoURL];
        self.newsDetailImageView.image =[UIImage imageWithData:photoData];
    

它将正确 segue 并且图像(已经从第一个请求中保留)将被加载,但文本(从 segue 的请求中检索)不会。事实上 valueForKey fullArticle 是空的。

根据这个问题,我可能很明显我是一个菜鸟。考虑到这一点,代码 sn-ps 非常有帮助。谢谢!

【问题讨论】:

是否有原因您没有在目标视图控制器中加载数据并处理成功和错误回调以便您知道发生了什么? Wain,主要是因为我在这方面还很陌生,并且仍在学习处理这些事情的最佳方法。您是否建议我在详细视图控制器的 viewDidLoad 部分调用服务器并从那里加载所有内容?如果是这样,我曾考虑过这一点,但认为在 segue 中执行操作会更容易。我认为主视图控制器具有所有必要的组件来进行调用并将结果传递给细节视图控制器。我愿意接受建议!如果您看到更好的方法,我会试一试。 我会做更多的事情,比如将路径传递给目标视图控制器,并允许它开始下载并处理响应数据 + 回调。 【参考方案1】:

由于您正在执行异步请求,因此您要显示的数据是在 destinationViewController 实际出现之后到达的。因此,您应该将 success 块传递给您的请求并更新其中的视图。像这样的:

UIViewController *viewController = [segue destinationViewController];
[[RKObjectManager sharedManager] getObjectsAtPath:getArticle parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) 
    if (!operation.error) 
        viewController.newsDetailText.text = mappingResult.firstObject[@"fullArticle"];
    
 failure:nil];

【讨论】:

leo,刚刚尝试了您的建议。逻辑是有道理的,但我收到此错误-[NSManagedObject objectForKeyedSubscript:]: unrecognized selector sent to instance 0x854ba60 它发生在viewController.newsDetailText.text 行上。有什么想法吗? 本,感谢您的考虑。我实际上并没有实现这段代码,只是按照 RestKit 文档编写的。根据您收到的错误,mappingResult.firstObject[@"fullArticle"] 有问题。尝试检查您的数据如何从mappingResult 获得。这是该课程的documentation。 Leo,我查看了文档,但我不确定我是否可以利用您的建议,但我感谢您的努力。我已经不再在 segue 中执行此操作,而是按照上面 wain 的建议。不过,我仍然遇到同样的知识匮乏。我似乎无法弄清楚如何利用fetchedResultsController 对我刚刚从服务器获取的对象执行获取。 你试过了吗? NSError *error = nil; id _id = @(1234); NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:NSStringFromClass([NSManagedObject class])]; fetchRequest.predicate = [NSPredicate predicateWithFormat:@"SELF.id == %@", _id]; [managedObjectContext executeFetchRequest:fetchRequest error:&error]; 我还没有,因为我正在使用处理所有这些步骤的fetchedResultsController 方法。我在苹果开发者库中研究了这些确切的行,但还没有承诺尝试。我将它粘贴到我的代码中。现在我不确定 NSPredicate 函数的作用。代码在该行引发异常。目前正在努力。

以上是关于如何在 segue 中从 CoreData 获取结果的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Swift 的后台线程中从 CoreData 中获取未保存的数据?

CoreData 或 Segue 用于访问类实例

如何在 Swift 中从 Core Data 中删除数据时删除 UITableView 行?

如何在 GameScene 中从 ViewController 调用方法

在 Core Data 中从库中保存和获取多个图像选择

在 Swift Core Data 中从一对多关系中获取对象