NSPrintOperation挂起应用程序

时间:2010-10-13 01:14:00

标签: objective-c multithreading nsprintoperation

每当我调用NSPrintOperation时,我都会挂起一个应用程序。

我有一个视图,它会创建一个单独的类(UIView),如下所示:

PBPrintImage *printImage = [[PBPrintImage alloc] init];
printImage.image = finalImage;
[printImage printWithNoPanel:self];

然后在PBPrintImage中我有以下方法:

- (void)printWithNoPanel:(id)sender {
    CGSize picSize = CGSizeMake(300, 446);
    NSPrintInfo *printInfo = [NSPrintInfo sharedPrintInfo];

    NSRect imageRect = NSRectFromCGRect(CGRectMake(0, 0, picSize.width, picSize.height));
    NSImageView *imageView = [[NSImageView alloc] initWithFrame:imageRect];
    [imageView setImage:image];

    NSPrintOperation *op = [NSPrintOperation printOperationWithView:imageView printInfo:printInfo];
    [op setCanSpawnSeparateThread:YES];
    [op setShowsPrintPanel:NO];
    [op runOperation];
}

如果我不打电话,那么该应用程序可以正常工作。而且我已尝试使用和不使用setCanSpawnSeparateThread:来调用它。我如何设置它以便它必须在一个单独的线程中,因此不会搞乱应用程序的常规流程?

它打印,但这只是工作的一半。

1 个答案:

答案 0 :(得分:0)

应用程序应显示模态打印对话框(并启动模态运行循环),因此我不会将其称为“挂起”。只要您点击确定或取消,它就会返回到正常的主线程流程。

对于setCanSpawnSeparateThread:问题,它只在打印对话框显示为工作表时启动,因此您需要像这样调用它:`[op runOperationModalForWindow:window delegate:self didRunSelector:@selector( _printOperationDidRun:success:contextInfo :) contextInfo:nil]