我将“核心数据”嵌入到我的应用中。我使用谓词并获取结果。我使用一个名为“fetchedObjects”的mutableArray来获取(谓词然后获取)结果。现在我需要将此结果传递给另一个视图控制器。我怎么能这样做?
1.我尝试的第一件事是使用'NSCoding',但它没有成功。我认为Core Data不符合NSCoding,对吗?
如果我可以使用'NSCoding',我该怎么做?我试图保存然后加载fetchedObjects但它没有用完。
2.当然我可以使用
定义指针"product = [[Product alloc] initWithEntity:entity insertIntoManagedObjectContext:self.managedObjectContext];"
但是如何才能获得“fetchedObjects”mutableArray而不是所有对象呢?
3.你知道更好的方法来传递一个包含NSManagedObjects的NSMutableArray吗?我们如何才能将NSManagedObjects传递给其他视图控制器,仅在上下文中?
谢谢!
答案 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];