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

标签 ios objective-c-blocks uimanageddocument

如标题中所述,我想同步打开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/

相关文章:

ios - 有什么方法可以快速使用 AVCaptureSession 对象逐帧获取?

core-data - UIManagedDocument - 如何处理 UIDocumentStateSavingError?

ios5 - 使用未声明的标识符 'NSMigratePersistentStoresAutomaticallyOption'

ios - UIDocument openWithCompletionHandler 未在 iOS 设备上完成

iOS Viewcontroller 引用 TableView IBOutlet - 弱还是强?

ios - Interface Builder 如何与私有(private) IBOutlet 交互?

ios - 跟踪 _objc_msgSend 在 dispatch_sync block 内崩溃的策略

iphone - "Incompatible pointer to integer conversion"使用方 block 时

ios - 根据方法的调用方式, block 的行为有所不同

ios - 如何使用 3rd 方分发配置文件构建 iOS 应用程序