1

我正在尝试为 QuickLook 框架创建一个多页 PDF 以进行打印,但在创建它时无法更新 UI(我希望用户获得剩余页数的倒计时)。下面的代码是我试图用线程睡眠的东西代替需要一段时间才能呈现的代码的简化版本。

- (void) testPDF
{
    CGRect pageSize = CGRectMake(0.0f, 0.0f, 595.28, 841.89);

    UIGraphicsBeginPDFContextToFile([self filePath], pageSize, nil);
    {
        UIGraphicsBeginPDFPage();

        for( int y = 0; y < 5; y++ )    {
            self.pageLabel.text = [NSString stringWithFormat:@"%d", y];

            [[UIColor grayColor] set];
            [@"test string" drawAtPoint:CGPointMake(0, y*20) withFont:[UIFont systemFontOfSize:15]];

            NSDate *future = [NSDate dateWithTimeIntervalSinceNow: 1.0];
            [NSThread sleepUntilDate:future];
        }
    }
    UIGraphicsEndPDFContext();
}

就目前而言,我的代码呈现 PDF 但不更新 IBOutlet 'pageLabel',任何帮助将不胜感激。

4

1 回答 1

1

在后台线程上运行 PDF 创建,但在主(又名 UI)线程上更新 UI。PDF 创建完成后,调用方法(在本例presentPDF中为 )将 PDF 呈现给用户,确保在这样做之前切换到主线程。例如:

-(void)presentPDF{

    // Make sure this runs on the main (UI) thread
    dispatch_sync(dispatch_get_main_queue(), ^{

        //Insert code to present the PDF...

    });
}

- (void) testPDF
{

    // Run on background thread
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        CGRect pageSize = CGRectMake(0.0f, 0.0f, 595.28, 841.89);

        UIGraphicsBeginPDFContextToFile([self filePath], pageSize, nil);
        {
            UIGraphicsBeginPDFPage();

            for( int y = 0; y < 5; y++ ){

                // Make sure this runs on the main (UI) thread
                dispatch_sync(dispatch_get_main_queue(), ^{
                    self.pageLabel.text = [NSString stringWithFormat:@"%d", y];

                });

                [[UIColor grayColor] set];
                [@"test string" drawAtPoint:CGPointMake(0, y*20) withFont:[UIFont systemFontOfSize:15]];

                NSDate *future = [NSDate dateWithTimeIntervalSinceNow: 1.0];
                [NSThread sleepUntilDate:future];
            }
        }
        UIGraphicsEndPDFContext();

        [self presentPDF];
    });
}
于 2013-07-07T19:48:50.917 回答