如何打开/同步创建UIManagedDocument?(How to open/create UIM

2019-06-25 07:56发布

正如标题所说,我想开UIManagedDocument同步,也就是说,我想我的执行等到打开完成。 我只在mainThread打开文档。

当前API开放使用块

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

在提到锁的使用环节上顺畅运行比主线程其他线程。 如果我使用锁在mainThread ,它冻结的应用程序的执行。

任何意见将是有益的。 谢谢。

Answer 1:

首先,让我说,我强烈反对这样做。 你的主线程只是等待,而什么都不做,而等待调用完成。 在某些情况下,系统会杀了你的应用程序,如果它不主线程上作出回应。 这是极不寻常的。

我想你应该决定什么时候/你应该如何使用各种编程工具之一。

这其中不正是你想要的...阻塞主线程,直到完成处理程序运行。 同样,我建议这样做,但是,嘿,这是一个工具,我会好好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是巨大的。 条件变量的方法或并发队列使用障碍是合理的方式使用其他线程时同步。 同步主线程是你应该做的正好相反。

祝你好运...,并确保您注册你的枪,并总是随身携带隐藏武器许可证。 这当然是狂野的西部。 总有一个约翰·卫斯理哈登在那里找了枪战。



文章来源: How to open/create UIManagedDocument synchronously?