UIPrintInteractionController仅在iOS 14上单击“取消”按钮时崩溃

问题描述

我的代码是:

uiprintinfo *pi = [uiprintinfo printInfo];
pi.outputType = uiprintinfoOutputGeneral;

Nsstring *url=[[req URL] absoluteString];
pi.jobName = url;

pi.orientation = uiprintinfoOrientationPortrait;
pi.duplex = uiprintinfoDuplexLongEdge;

UIPrintInteractionController *pic = [UIPrintInteractionController sharedPrintController];
pic.printInfo = pi;
pic.delegate=self;
pic.showsPageRange = YES;
pic.printFormatter = self.webView.viewPrintFormatter;


dispatch_async(dispatch_get_main_queue(),^(void)
{
   [pic presentFromrect:CGRectMake(64,64,self.view.frame.size.width,self.view.frame.size.height-64) inView:self.view animated:YES completionHandler:^(UIPrintInteractionController* pic2,BOOL completed,NSError* error) {
    
}];
    
});

显示的很好,但是当单击取消按钮以关闭视图时,它崩溃并显示以下消息:

试图从主线程或Web线程以外的线程获取Web锁。这可能是从辅助线程调用UIKit的结果。现在崩溃了

解决方法

我认为这很容易解决,困难的部分是知道在哪里修复。

您只给出一个代码段,这会使它更加困难。这是两次尝试。

尝试如下更改代码。 dispatch_async中包装的内容已全部更改。

    UIPrintInfo *pi = [UIPrintInfo printInfo];
    pi.outputType = UIPrintInfoOutputGeneral;

    NSString *url=[[req URL] absoluteString];
    pi.jobName = url;

    pi.orientation = UIPrintInfoOrientationPortrait;
    pi.duplex = UIPrintInfoDuplexLongEdge;

    dispatch_async( dispatch_get_main_queue (),^{

        UIPrintInteractionController *pic = [UIPrintInteractionController sharedPrintController];
        pic.printInfo = pi;
        pic.delegate=self;
        pic.showsPageRange = YES;
        pic.printFormatter = self.webView.viewPrintFormatter;


        [pic presentFromRect:CGRectMake(64,64,self.view.frame.size.width,self.view.frame.size.height-64) inView:self.view animated:YES completionHandler:^(UIPrintInteractionController* pic2,BOOL completed,NSError* error) {

        }];

    } );

我猜您在完成处理程序内执行stuff,因此下面是另一种尝试来确保stuff在主线程上完成。我认为这太过分了,但是取决于您如何对待stuff

    UIPrintInfo *pi = [UIPrintInfo printInfo];
    pi.outputType = UIPrintInfoOutputGeneral;

    NSString *url=[[req URL] absoluteString];
    pi.jobName = url;

    pi.orientation = UIPrintInfoOrientationPortrait;
    pi.duplex = UIPrintInfoDuplexLongEdge;

    dispatch_async( dispatch_get_main_queue (),^{

        UIPrintInteractionController *pic = [UIPrintInteractionController sharedPrintController];
        pic.printInfo = pi;
        pic.delegate=self;
        pic.showsPageRange = YES;
        pic.printFormatter = self.webView.viewPrintFormatter;

        [pic presentFromRect:CGRectMake(64,NSError* error) {

            dispatch_async( dispatch_get_main_queue (),^{
                ** stuff **
            } );

        }];

    } );