首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >iOS5.1:同步任务(等待完成)

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

Stack Overflow用户
提问于 2012-04-01 13:00:08
回答 1查看 1.2K关注 0票数 5

使openWithCompletionHandler:(UIManagedDocument)与主要活动同步有一个基本问题。

情境:我有一个管理共享UIManagedDocument的单例类。这个类提供了一个方法,它应该在正常状态下传递文档(即创建或打开文档,不管需要什么)。但是由于openWithCompletionHandler:在后台异步完成其主要工作,所以我的程序应该等待设置fetchedResultsController,直到文档真正打开。"viewWillAppear“方法(当前)在数据库尚未准备就绪时不会产生有用的输出。等待对我来说是可以的,但是得到通知可能是更好的方式。也许viewWillAppear不是setupFetchedResultsController的正确点,因为它不是在运行循环中调用的。

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

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

EN

回答 1

Stack Overflow用户

发布于 2012-04-27 02:48:12

我建议您关注贾斯汀·德里斯科尔具有单个共享UIManagedDocument的核心数据上的出色文章。

您将看到一个完整的UIManagedDocument单例和一个performWithDocument的例子。您的fetchedResultsController设置代码实际上应该放在performWithDocument:^{}块中。

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

如果你有兴趣的话,

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

代码语言:javascript
运行
复制
[[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(documentStateDidChange:)
                                                 name:UIDocumentStateChangedNotification
                                               object:self.document];

然后在performWithDocument中,关键的open/creation部分上的@self.document确保一次只进入一个线程,并阻塞进一步的线程直到打开/创建成功。

最后,添加以下函数:

代码语言:javascript
运行
复制
- (void)documentStateDidChange:(NSNotification *)notification
{
    if (self.document.documentState == UIDocumentStateNormal)
        @synchronized (self.document) {
            ... unblock other document openers ...
        }
}

至于块/解锁线程,YMMV。我使用了一个dispatch_semaphore_t和一些dispatch_queues来满足特定应用的需求。您的情况可能与等待完成或删除其他线程一样简单。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9964571

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档