2016-03-07 4 views
0

У меня возникли проблемы при создании PDF-файла из формы - есть несколько страниц (до 20, и я хочу создать файл в фоновом потоке)Подождите, пока файл PDF не будет готов?

Я хотел бы использовать обработчик завершения, поэтому файл создается, я хочу показать его в QLPreviewController. Но когда плохое использование функции ожидания/сна, она всегда сбой с ошибкой, что файл еще не закончен.

Так что на данный момент:

func exportPDF(fileName:String, task: completionHandler:(success:Bool) -> Void) { 
    // run on background 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { 

     UIGraphicsBeginPDFContextToFile(pdfFileName, CGRectZero, nil); 
     UIGraphicsBeginPDFPageWithInfo(CGRectMake(0, 0, 612, 792), nil); 

     // write pages 

     UIGraphicsEndPDFContext() 
     completionHandler(success:true) // how do i wait till file has finshed? 
    }) 
} 

Ill вызов с:

exportPDF(filepath, task: task, completionHandler:{(success:Bool) -> Void in 

     let when = dispatch_time(DISPATCH_TIME_NOW, Int64(0.2 * Double(NSEC_PER_SEC))) 
     let queue = dispatch_get_main_queue() 

     dispatch_after(when, queue) { 

      if self.finish == true { 

       let preview = ExportQLPreviewController() 
       preview.task = self.task 
       preview.dataSource = self 
       preview.preferredContentSize = CGSizeMake(700, 700) 
       preview.emaildelegate = self.emaildelegate 

       self.navigationController?.pushViewController(preview, animated: false) 


      } else { 

       let preview = QLPreviewController() 
       preview.dataSource = self 
       preview.preferredContentSize = CGSizeMake(700, 700) 
       self.navigationController?.pushViewController(preview, animated: false) 

      } 

     } 

}) 

Есть ли что-то не так? Как можно ждать, пока мой файл не будет написан? Потому что без метода «wait» он всегда сбой (похоже, что обработчик завершения не дожидается завершения UIGraphicsEndPDFContext())

ответ

0

Попробуйте использовать диспетчер_группы.

//Create a dispatch_group 
    let taskGroup = dispatch_group_create() 
    //Set a start label before your function 
    dispatch_group_enter(taskGroup) 
    //Put a end label after your function finished 
    dispatch_group_leave(taskGroup) 
    //And dispatch_group_notify will be called while 
    //number of enter labels = number of end labels 
    dispatch_group_notify(taskGroup, dispatch_get_main_queue(), { 
     //Do what you want after task is finished. 
    }) 

как это

enter image description here

Смежные вопросы