Objective c iOS5.1:同步任务(等待完成)

Objective c iOS5.1:同步任务(等待完成),objective-c,concurrency,uidocument,Objective C,Concurrency,Uidocument,我在将openWithCompletionHandler:(UIManagedDocument)与主要活动同步时遇到一个基本问题 情况: 我有一个管理共享UIManagedDocument的singleton类。此类提供了一种方法,该方法应在正常状态下交付文档(即创建或打开文档,无论需要什么)。 但是由于openWithCompletionHandler:在后台异步执行其主要任务,因此我的程序应该等待设置fetchedResultsController,直到文档真正打开。当数据库未就绪时,“vi

我在将openWithCompletionHandler:(UIManagedDocument)与主要活动同步时遇到一个基本问题

情况: 我有一个管理共享UIManagedDocument的singleton类。此类提供了一种方法,该方法应在正常状态下交付文档(即创建或打开文档,无论需要什么)。 但是由于openWithCompletionHandler:在后台异步执行其主要任务,因此我的程序应该等待设置fetchedResultsController,直到文档真正打开。当数据库未就绪时,“viewwillappease”方法(当前)不会产生任何有用的输出。 等待对我来说是可以的,但得到通知可能是更好的方式。可能ViewWillExeal不是setupFetchedResultsController的正确点,因为它不是在运行循环中调用的

是否有一个标准模式来实现这一点

更多的背景知识(我想不太重要) 我正在开发一个涉及CoreData UIManagedDocument的iOS 5.1小应用程序。 我类似于去年秋天斯坦福大学iTunes-U课程第14课中的例子。在我试图将UIManagedDocument的处理从UITableViewController类转移到处理我的文档的单独类之前,一切都很顺利。 在原始版本中,FetchedResultsController是在完成处理程序中设置的。

我建议您在上发表以下精彩文章

您将在UIManagedDocument singleton上找到完整的writeup,并在performWithDocument上找到一个示例。您的fetchedResultsController设置代码应该真正进入performWithDocument:^{}块

还要注意,openWithCompletionHandler不是线程安全的—打开文档时并发调用performWithDocument会导致崩溃。对我来说,这个解决方案是非常重要的(并且非常特定于应用程序),因此如果您遇到相同的问题,我建议您研究哪些通知文档状态更改,哪些可以作为多个文档开启器的同步点

如果你感兴趣的话,给我一些片段

首先在MYDocumentHandler的init中,在末尾设置一个附加通知:

[[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(documentStateDidChange:)
                                                 name:UIDocumentStateChangedNotification
                                               object:self.document];
然后,在performWithDocument中,在关键的打开/创建部分上设置@synchronized(self.document),以确保一次只进入一个线程,并阻止更多线程,直到打开/创建成功

最后添加以下函数:

- (void)documentStateDidChange:(NSNotification *)notification
{
    if (self.document.documentState == UIDocumentStateNormal)
        @synchronized (self.document) {
            ... unblock other document openers ...
        }
}
对于阻塞/解锁线程,YMMV。我使用了dispatch_信号量和一些dispatch_队列来满足特定于应用程序的需求。您的情况可以像等待完成或删除其他线程一样简单