Повышение производительности на iphone при рендеринге PDF - PullRequest
3 голосов
/ 30 мая 2010

У меня есть UITableView, и в каждой ячейке отображается UIImage, созданный из PDF-файла. Но сейчас производительность очень плохая. Вот мой код, который я использую для создания UIImage из PDF.

Создание CGPDFDocumentRef и UIImageView (в методе cellForRowAtIndexPath):

...    
CFURLRef pdfURL = CFBundleCopyResourceURL(CFBundleGetMainBundle(), (CFStringRef)formula.icon, NULL, NULL);
CGPDFDocumentRef documentRef = CGPDFDocumentCreateWithURL((CFURLRef)pdfURL);
CFRelease(pdfURL);
UIImageView *imageView = [[UIImageView alloc] initWithImage:[self imageFromPDFWithDocumentRef:documentRef]];
...

Создание UIImage:

- (UIImage *)imageFromPDFWithDocumentRef:(CGPDFDocumentRef)documentRef {
    CGPDFPageRef pageRef = CGPDFDocumentGetPage(documentRef, 1);
    CGRect pageRect = CGPDFPageGetBoxRect(pageRef, kCGPDFCropBox);

    UIGraphicsBeginImageContext(pageRect.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextTranslateCTM(context, CGRectGetMinX(pageRect),CGRectGetMaxY(pageRect));
    CGContextScaleCTM(context, 1, -1);  
    CGContextTranslateCTM(context, -(pageRect.origin.x), -(pageRect.origin.y));
    CGContextDrawPDFPage(context, pageRef);

    UIImage *finalImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return finalImage;
} 

Что я могу сделать, чтобы увеличить скорость и сохранить объем памяти?

1 Ответ

3 голосов
/ 30 мая 2010

Создание изображения из PDF для каждой ячейки во время выполнения кажется огромным ударом по производительности.

Вы должны попытаться рассмотреть возможность выполнения фактического рендеринга в фоновом потоке, сохранить результат визуализации UIImages и заполнить их UITableView во время выполнения. Это как минимум освободит поток пользовательского интерфейса и добавит отзывчивость приложению.

Для ячеек, которые еще не отображены, вы можете отобразить сообщение «загрузка» или добавить счетчик «Индикатор активности».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...