gpt4 book ai didi

ios - 如何同步打开/创建 UIManagedDocument?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:22:16 26 4
gpt4 key购买 nike

如标题中所述,我想同步打开 UIManagedDocument,即,我希望我的执行等到打开完成。我仅在 mainThread 上打开文档。

当前要打开的 API 使用 block

[UIManagedDocument openWithCompletionHandler:(void (^)(BOOL success))];

link 中提到的锁用法在主线程以外的线程上运行良好。如果我在 mainThread 上使用锁,它会卡住应用程序的执行。

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

最佳答案

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

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

这正是您想要的...阻塞主线程直到完成处理程序运行。同样,我建议这样做,但是嘿,这是一种工具,我会采取 NRA 的立场:枪不会杀人......

__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);
}

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

__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];
}

还有其他方法,但这些方法简单、易于理解,并且像拇指一样突出,因此很容易知道您在做一些非正统的事情。

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

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

祝你好运......并确保你登记了你的枪支,并始终携带你的隐藏武器许可证。这当然是狂野的西部。总是有一个约翰韦斯利哈登在那里寻找枪战。

关于ios - 如何同步打开/创建 UIManagedDocument?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10314190/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com