如何将包含NSManagedObjects的NSMutableArray传递给另一个视图控制器?

时间:2013-10-09 03:36:39

标签: objective-c core-data uiviewcontroller nspredicate nscoding

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

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

如果我可以使用'NSCoding',我该怎么做?我试图保存然后加载fetchedObjects但它没有用完。

2.当然我可以使用

定义指针
"product = [[Product alloc] initWithEntity:entity insertIntoManagedObjectContext:self.managedObjectContext];" 

但是如何才能获得“fet​​chedObjects”mutableArray而不是所有对象呢?

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

谢谢!

3 个答案:

答案 0 :(得分:1)

您可以使用NSNotification。

Say View Controller A获取结果,View Controller 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就像任何其他对象一样,不需要使用编码。在修改和保存它们时需要小心!

答案 1 :(得分:1)

不是直接传递托管对象,如果所有这些对象都已保存,我会传递ObjectID或唯一的URL,让接收者从商店中检索它们。

检索速度很快,并且还可以避免并发时可能出现的许多问题。

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

<强>更新

如果我理解你的评论,NSFRC的一大优势就是它带来的一堆委托方法。如果你使你的UIViewController成为你的NSFRC的委托NSFetchedResultsControlerDelegate,那么只要模型发生了变化,获取的控制器本身就会调用你的视图控制器实现的委托方法。然后在此方法中,您必须刷新表视图。 该视图本身不会被刷新。

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

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

P.S。 对不起,目前我在阻止许多网站(包括Apple文档)的公司防火墙后面,因此我无法给你任何链接。

答案 2 :(得分: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];