UIPreviewAction 中的调度信号量冻结应用程序
Dispatch semaphore in UIPreviewAction freezes app
我正在使用带有 3D Touch 的 UIPreviewAction
来调用函数,该函数使用调度信号量来确定异步块何时完成。但是,一旦在那些被调用的函数中涉及调度信号量,UI 就会冻结,或者更确切地说,任何用户输入都会被阻止。
如何解决这个问题?
在此先感谢 Fabian。
代码示例:
UIPreviewAction:
UIPreviewAction *action = [UIPreviewAction actionWithTitle:@"Action" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
[(SenderViewController *)self.sender function];
}
被调用的函数:
- (void)function {
dispatch_semaphore_t sema2 = dispatch_semaphore_create(0);
BOOL selected = false;
UIAlertController *enterPasswordAlert = [UIAlertController alertControllerWithTitle:alertTitle message:alertMessage preferredStyle:UIAlertControllerStyleAlert];
[enterPasswordAlert addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
dispatch_semaphore_signal(sema2);
}]];
[enterPasswordAlert addAction:[UIAlertAction actionWithTitle:@"Action" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
selected = true;
dispatch_semaphore_signal(sema2);
}]];
[self presentViewController:enterPasswordAlert animated:true completion:nil];
while (dispatch_semaphore_wait(sema2, DISPATCH_TIME_NOW)) {
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:10]];
}
if (!selected) return;
}
为了结束这个问题,我已经使用 vadian 提供的解决方案解决了这个问题。我只是使用一个调度组并将我的代码扔到 dispatch_group_notify.
的执行块中,该代码应该在选择发生后执行。
我正在使用带有 3D Touch 的 UIPreviewAction
来调用函数,该函数使用调度信号量来确定异步块何时完成。但是,一旦在那些被调用的函数中涉及调度信号量,UI 就会冻结,或者更确切地说,任何用户输入都会被阻止。
如何解决这个问题?
在此先感谢 Fabian。
代码示例:
UIPreviewAction:
UIPreviewAction *action = [UIPreviewAction actionWithTitle:@"Action" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
[(SenderViewController *)self.sender function];
}
被调用的函数:
- (void)function {
dispatch_semaphore_t sema2 = dispatch_semaphore_create(0);
BOOL selected = false;
UIAlertController *enterPasswordAlert = [UIAlertController alertControllerWithTitle:alertTitle message:alertMessage preferredStyle:UIAlertControllerStyleAlert];
[enterPasswordAlert addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
dispatch_semaphore_signal(sema2);
}]];
[enterPasswordAlert addAction:[UIAlertAction actionWithTitle:@"Action" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
selected = true;
dispatch_semaphore_signal(sema2);
}]];
[self presentViewController:enterPasswordAlert animated:true completion:nil];
while (dispatch_semaphore_wait(sema2, DISPATCH_TIME_NOW)) {
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:10]];
}
if (!selected) return;
}
为了结束这个问题,我已经使用 vadian 提供的解决方案解决了这个问题。我只是使用一个调度组并将我的代码扔到 dispatch_group_notify.
的执行块中,该代码应该在选择发生后执行。