QLPreviewController медленная загрузка многостраничных документов

Я использую QLPreviewController для предварительного просмотра PDF.

Сначала я получаю путь к файлу:

NSString *PDFPath = [[[[self.tableData objectAtIndex:indexPath.row] objectForKey:@"Name"] componentsSeparatedByString:@"FTP\\"] lastObject];

NSString *PDFFile = [[[[self.tableData objectAtIndex:indexPath.row] objectForKey:@"Name"] componentsSeparatedByString:@"\\"] lastObject];

NSString *encodedUrlStr = [PDFPath urlencode];

Затем я беру путь к файлу и получаю байты файла PDF из API веб-службы.

NSURLSessionTask *task = [dataSource.areaData GetPDFFileTestTwo:[NSString stringWithFormat:@"%@",encodedUrlStr] completion:^(NSData *data, NSURLResponse *response, NSError *error) {

}];

Внутри обработчика завершения я затем конвертирую байты в NSData:

NSError *myError;
NSArray *tableArray = [[NSArray alloc]initWithArray:[NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&myError]];

NSData *dataBytes;

for (NSDictionary *dict in tableArray) {
     NSString *base64 = dict[@"data"];
     dataBytes = [[NSData alloc] initWithBase64EncodedString:base64 options:0];
}

Затем я беру NSData и сохраняю его в папку с документами, используя NSFileManager:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];

filePath = [NSString stringWithFormat:@"%@/%@", documentsDirectory,PDFFile];

if (![[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
     [[NSFileManager defaultManager] createFileAtPath:filePath contents:dataBytes attributes:nil];
}

а затем я просматриваю PDF, используя QLPreviewController:

dispatch_async(dispatch_get_main_queue(), ^{

     _previewController = [[QLPreviewController alloc] init];

     _previewController.dataSource = self;
     _previewController.delegate = self;

     [self presentViewController:_previewController animated:NO completion:^{
          [_previewController didMoveToParentViewController:self];
     }];

});

Проблема, с которой я сталкиваюсь, заключается в том, что когда QLPreviewController представлен с несколькими страницами (не несколькими документами), иногда загружается все страницы медленно, я получаю серые страницы, пока они не загружаются, иногда мое приложение вылетает, а иногда я получаю эту ошибку:

Ошибка связи: { count = 1, contents = "XPCErrorDescription" => { length = 22, contents = "Соединение прервано" } }>

Недостаточно памяти (22,2–25 МБ). Размер файла PDF варьируется от 465 КБ до 2 МБ, иногда 5,5 МБ.

Мне бы очень хотелось, чтобы я мог загрузить файл в QLPreviewController и затем представить, но я ищу что-то в этом роде, я прочитал сопоставленные файлы, но не до конца их понимаю.

О да, и вот мои методы делегата:

- (NSInteger) numberOfPreviewItemsInPreviewController: (QLPreviewController *) controller
{
    return 1;
}

- (id <QLPreviewItem>)previewController:(QLPreviewController *)controller previewItemAtIndex:(NSInteger)index
{
    return [NSURL fileURLWithPath:filePath];
}

и здесь определен previewController:

@property (nonatomic, retain) QLPreviewController *previewController;

Кто-нибудь может помочь?

0 ответов

Другие вопросы по тегам