如标题中所述,我想同步打开UIManagedDocument
,即我希望执行等待直到打开完成。我仅在主线程上打开文档。
当前要打开的 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/