2012-09-25 49 views
2

我正在使用核心数据,并想知道我是否正确地做事情。我打开我的UIManagedDocument从单身物件使用完成处理程序和下面。UIManagedDocument CompletionHandler&NSNotification

[[self managedDocument] openWithCompletionHandler:^(BOOL success) { 
      if(success) { 
       NSLog(@"DOCUMENT: Success, Opened ..."); 
       // TODO: Things to do when open. 
       // ... 
       // ... 
      } 
}]; 

在我UIViewController我有安装观察员观看了UIDocumentStateChangedNotification表明,我就可以开始与文档工作。

- (void)awakeFromNib { 
    NSLog(@"%s", __PRETTY_FUNCTION__); 
    NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; 
    [notificationCenter addObserver:self selector:@selector(documentIsReady) name:UIDocumentStateChangedNotification object:nil]; 
} 

这接缝工作得很好,但我意识到,我不使用回调。一种解决方案可能是创建我自己的通知并从发布它,它本质上做了同样的事情,但只是使代码更易于阅读。任何意见将不胜感激。

回答

2

我想说,如果你只需要通知一个控制器,一次,并且只有当文档被打开时(你有一个应用程序使用一个单一的UIManagedDocument在控制器之间传递,如CS193P演示),它最好只在完成块内留下代码。

但是,如果您的应用程序要打开和关闭文档多次,并且多个控制器必须知道该更改,则应该使用通知。

+0

我确实有多个控制器都使用NSFetchedResultsControllers和UITableViews,但是他们都做同样的UIManagedDocument访问。我的问题是,我在每个控制器上设置了不同的NSFetchResultsControllers,所以我需要进行通信,然后文档已准备就绪,这样我就可以执行我的初始抓取,特别是在“初始控制器”上,因为在托管文档实际上已准备就绪使用。 – fuzzygoat

+0

我的应用类似。我有大约6个不同的UITableViews,每个人都设置它自己的NSFetchedResultsController。第一个控制器创建并打开UIManagedDocument,并将其保留在其某个属性中。之后每个控制器都被赋予一个NSManagedObject(他们将需要创建谓词)的副本,并使用它来设置他们自己的NSFetchedResultsController。由于其他控制器不能访问,除非文档打开并且第一个控制器中的tableview加载了它的数据,我不必担心通知它们。 –

+0

Mine几乎是一样的,唯一的区别是UIManagedDocument是在从AppDelegate实例化的单例中创建的。我本可以把它放在AppDelegate中,但我还有一些其他的东西我想保持分开。感谢您的帮助,非常感谢。 – fuzzygoat