UIPreviewAction中的调度信号量冻结应用程序

时间:2017-02-17 11:06:19

标签: objective-c xcode grand-central-dispatch 3dtouch

我正在使用带有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;
}

1 个答案:

答案 0 :(得分:0)

要结束此问题,我已使用 vadian 提供的解决方案解决了这个问题。我只是使用一个调度组,并在dispatch_group_notify的执行块中抛出我的代码,该代码应在选择发生后执行。