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

5

我有一个基本问题,即如何同步openWithCompletionHandler: (UIManagedDocument)与主要活动。

情况: 我有一个单例类来管理共享的UIManagedDocument。这个类提供了一个方法,应该在正常状态下提供文档(即创建或打开它,无论是什么)。但是,由于openWithCompletionHandler:在后台异步执行其主要工作,因此我的程序应该等待设置fetchedResultsController,直到文档真正打开。当数据库没有准备好时,“viewWillAppear”方法(目前)不会产生有用的输出。 等待对我来说没问题,但通知可能是更好的方式。也许viewWillAppear不是正确的点来setupFetchedResultsController,因为它没有在runloop中调用。

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

背景略微复杂(我认为不太重要) 我正在开发一个涉及CoreData UIManagedDocument的iOS 5.1应用程序。我参考了去年秋季斯坦福课程中第14课的示例。一切都很顺利,直到我尝试将UIManagedDocument的处理从UITableViewController类移到一个单独的处理文档的类中。在原始版本中,FetchedResultsController是在完成处理程序中设置的。

1个回答

3

我建议您跟随Justin Driscoll的优秀文章使用单个共享UIManagedDocument的Core Data

您将找到有关UIManagedDocument单例模式的完整说明以及performWithDocument示例。您的fetchedResultsController设置代码确实应该放在performWithDocument:^{}块中。

还要注意,openWithCompletionHandler不是线程安全的 - 在打开文档时并发调用performWithDocument将导致崩溃。对我来说,解决方案并不简单(而且相当特定于应用程序),因此如果您遇到同样的问题,我建议您查看UIDocumentStateChangedNotification,它通知文档状态更改并可以成为多个文档打开器的同步点。

一些片段,如果您感兴趣,

首先,在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 ...
        }
}

关于阻塞/解除线程,因人而异。我使用了dispatch_semaphore_t和一些dispatch_queues来满足应用程序特定的要求。你的情况可能只是等待完成或丢弃其他线程。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接