首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何同步打开/创建UIManagedDocument?

如何同步打开/创建UIManagedDocument?
EN

Stack Overflow用户
提问于 2012-04-25 10:54:34
回答 1查看 2K关注 0票数 2

正如标题中提到的,我希望同步地打开UIManagedDocument,也就是说,我希望我的执行等待打开完成。我只在mainThread上打开文件。

当前要打开的API使用块

代码语言:javascript
复制
[UIManagedDocument openWithCompletionHandler:(void (^)(BOOL success))];

链接中提到的锁使用在主线程以外的线程上工作得很好。如果我在mainThread上使用锁,它会冻结应用程序的执行。

任何建议都会有帮助。谢谢。

EN

回答 1

Stack Overflow用户

发布于 2012-05-05 13:04:40

首先,让我说,我强烈反对这样做。您的主线程只是等待,在等待调用完成时什么也不做。在某些情况下,如果应用程序在主线程上没有响应,系统就会杀死它。这是非常不寻常的。

我想应该由您来决定何时/如何使用各种编程工具。

这个做你想做的..。阻塞主线程,直到完成处理程序运行为止。再说一遍,我不建议这样做,但是嘿,这是一个工具,我会采取NRA的立场:枪不会杀人.

代码语言:javascript
复制
__block BOOL waitingOnCompletionHandler = YES;
[object doSomethingWithCompletionHandler:^{
    // Do your work in the completion handler block and when done...
    waitingOnCompletionHandler = NO;
}];
while (waitingOnCompletionHandler) {
    usleep(USEC_PER_SEC/10);
}

另一个选项是执行run循环。但是,这并不是真正的同步,因为run循环实际上将处理其他事件。我在一些单元测试中使用了这种技术。它类似于上面的内容,但仍然允许在主线程上发生其他事情(例如,完成处理程序可能会调用主队列上的操作,这在前面的方法中可能不会被执行)。

代码语言:javascript
复制
__block BOOL waitingOnCompletionHandler = YES;
[object doSomethingWithCompletionHandler:^{
    // Do your work in the completion handler block and when done...
    waitingOnCompletionHandler = NO;
}];
while (waitingOnCompletionHandler) {
    NSDate *futureTime = [NSDate dateWithTimeIntervalSinceNow:0.1];
    [[NSRunLoop currentRunLoop] runUntilDate:futureTime];
}

也有其他的方法,但这些方法简单,容易理解,突出像一个疼痛的拇指,所以它很容易知道你在做一些非正统的事情。

我还应该指出,除了测试之外,我从来没有遇到过这样做的好理由。您可以死锁您的代码,而不从主run循环返回是一个滑坡(即使您自己手动执行它--请注意,您仍然在等待并再次运行该循环,可能会重新输入该代码,或者导致其他问题)。

异步API是很棒的。在使用其他线程时,条件变量方法或对并发队列使用障碍是同步的合理方法。同步主线程与您应该做的正好相反。

祝你好运。并确保你登记了你的枪,并始终携带你隐藏的武器许可证。这无疑是狂野的西部。总有一个约翰·韦斯利·哈登在外面找枪战。

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

https://stackoverflow.com/questions/10314190

复制
相关文章

相似问题

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