使openWithCompletionHandler:(UIManagedDocument)与主要活动同步有一个基本问题。
情境:我有一个管理共享UIManagedDocument的单例类。这个类提供了一个方法,它应该在正常状态下传递文档(即创建或打开文档,不管需要什么)。但是由于openWithCompletionHandler:在后台异步完成其主要工作,所以我的程序应该等待设置fetchedResultsController,直到文档真正打开。"viewWillAppear“方法(当前)在数据库尚未准备就绪时不会产生有用的输出。等待对我来说是可以的,但是得到通知可能是更好的方式。也许viewWillAppear不是setupFetchedResultsController的正确点,因为它不是在运行循环中调用的。
是否有一个标准的模式来实现这一点?
更多的背景(我认为不是很重要),我正在做一个小的iOS 5.1应用程序,涉及一个CoreData UIManagedDocument。我很像去年秋天斯坦福大学iTunes课程第14课的例子。在我试图将UIManagedDocument的处理从UITableViewController类转移到处理文档的单独类之前,一切都很正常。在原始版本中,在完成处理程序中设置了FetchedResultsController。
发布于 2012-04-27 02:48:12
我建议您关注贾斯汀·德里斯科尔在具有单个共享UIManagedDocument的核心数据上的出色文章。
您将看到一个完整的UIManagedDocument单例和一个performWithDocument的例子。您的fetchedResultsController设置代码实际上应该放在performWithDocument:^{}块中。
还请注意,openWithCompletionHandler不是线程安全的--在打开文档时并发调用performWithDocument将导致崩溃。对于我来说,解决方案并不简单(而且非常特定于应用程序),因此,如果您遇到相同的问题,我建议您查看UIDocumentStateChangedNotification,它会通知文档状态更改,并且可以作为多个文档打开器的同步点。
如果你有兴趣的话,
首先,在MYDocumentHandler的init中,在最后设置一个附加通知:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(documentStateDidChange:)
name:UIDocumentStateChangedNotification
object:self.document];然后在performWithDocument中,关键的open/creation部分上的@self.document确保一次只进入一个线程,并阻塞进一步的线程直到打开/创建成功。
最后,添加以下函数:
- (void)documentStateDidChange:(NSNotification *)notification
{
if (self.document.documentState == UIDocumentStateNormal)
@synchronized (self.document) {
... unblock other document openers ...
}
}至于块/解锁线程,YMMV。我使用了一个dispatch_semaphore_t和一些dispatch_queues来满足特定应用的需求。您的情况可能与等待完成或删除其他线程一样简单。
https://stackoverflow.com/questions/9964571
复制相似问题