1

我将“核心数据”嵌入到我的应用程序中。我使用谓词并获取结果。我使用一个名为“fetchedObjects”的 mutableArray 来获取(预测然后获取)结果。现在我需要将此结果传递给另一个视图控制器。我怎样才能做到这一点?

1.我尝试的第一件事是使用“NSCoding”,但没有成功。我认为 Core Data 不符合 NSCoding,对吗?

如果我可以使用“NSCoding”,我该怎么做?我尝试保存然后加载 fetchedObjects,但没有成功。

2.当然我可以使用定义一个指针

"product = [[Product alloc] initWithEntity:entity insertIntoManagedObjectContext:self.managedObjectContext];" 

但我怎样才能得到“fetchedObjects”mutableArray 而不是所有的对象?

3.您知道传递包含 NSManagedObjects 的 NSMutableArray 的更好方法吗?我们如何才能将 NSManagedObjects 传递给其他视图控制器,仅在上下文中?

谢谢!

4

3 回答 3

1

您可以使用 NSNotification。

假设视图控制器 A 获取结果,而视图控制器 B 需要它们。

在 VCA 中:

NSArray *data = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];

[[NSNotificationCenter defaultCenter]
 postNotificationName:@"newFetchedDataNotification"
               object:nil
             userInfo:@{@"data": data}];

在 VCB 中:

在 viewWillAppear 中,开始监听通知:

 [[NSNotificationCenter defaultCenter] addObserver:self
                                          selector:@selector(processData)
                                              name:@"newFetchedDataNotification"
                                            object:nil];

并添加一个方法:

- (void)processData:(NSNotification *)notification
{
    NSArray *data = [notification.userInfo objectForKey:@"succeeded"]
}

并且不要忘记在 viewWillDisappear 中取消注册通知:

    [[NSNotificationCenter defaultCenter] removeObserver:self];

我仍然认为首选方法是使用 NSFetchedResultsController 进行第一次获取并在对象更改时收到通知。看看这个教程:

http://www.raywenderlich.com/999/core-data-tutorial-for-ios-how-to-use-nsfetchedresultscontroller

PS:NSManagedObjects 和其他对象一样,不需要使用编码。但是,在修改和保存它们时需要小心!

于 2013-10-09T05:45:44.550 回答
1

与其直接传递托管对象,如果它们都已保存,我将传递 ObjectID 或唯一 url,并让接收者从商店中检索它们。

检索速度快,也避免了很多并发可能出现的问题。

如果接收控制器只需要显示数据,我也会考虑使用 NSDictionary 结果类型仅检索您需要的属性,并将结果数组传递给控制器​​。但是,当然,我对你的设计一无所知。

更新

如果我正确理解了您的评论,NSFRC 的一大优势是它带来了一堆委托方法。如果您将 UIViewController 设置为 NSFRC 的委托,NSFetchedResultsControlerDelegate那么只要模型发生更改,获取的控制器本身就会调用您的视图控制器实现的委托方法。然后在这个方法中你必须刷新你的表格视图。视图不会自行刷新。

不同之处在于,如果您的 UITableView 数据源只是一个托管对象数组,您将需要自己构建所有逻辑以响应模型更改,识别需要刷新的单元格,然后决定是否删除/更新/移动等..如果您考虑一下,要实现的逻辑很多,并且不会像已经为此目的定制的NSFRC那样高效。

此外,通过阅读您的其余评论,您无法传递 NSFetchedResultsController,我想您可以传递,但它没用,NSFRC 旨在在屏幕上的 UIViewController 中创建和使用。NSFRC 使用少量参数进行实例化,其中一个是 a NSFetchRequest,因此您必须自定义请求以检索所需的对象。

PS 抱歉,目前我位于阻止许多网站(包括 Apple 文档)的公司防火墙后面,因此我无法为您提供任何链接。

于 2013-10-09T09:42:19.930 回答
0

以简单的方式,

VC2.h

@property (strong) NSMutableArray *device;

VC2.m

@synthesize device;

现在在您要从中传递数组的 VC1 中

    VC2 *v2=[VC2 alloc]initWithNibName:@"VC2" bundle:nil];
    v2.device = array;
    [self.navigationController pushViewController:v2 animated:YES];

或者如果您没有使用 Navigationcontroller。

[self presentViewController:v2 animated:YES completion:nil];
于 2013-10-09T04:03:47.880 回答