2017-12-20 9 views
0

複数のHTMLファイルから複数のPDFを生成します。使用iclems機能は、複数のPDF変換に複数のHTMLを有効にするために、私はforループを包むよ

for (int i=0; i<= 47; i++) { 

    NSString *inputHTMLfileName = [NSString stringWithFormat:@"wkhtml_tempfile_%d",j]; 
    NSString *outputPDFfileName = [NSString stringWithFormat:@"~/Documents/%d_delegateDemo%d.pdf",loop,j]; 

    NSURL *htmlFileUrl = [[NSBundle mainBundle] 
          URLForResource:inputHTMLfileName withExtension:@"html"]; 


    // Check for existing pdf file and remove it 
    NSError *pdfDeleteError; 
    if ([[NSFileManager defaultManager] fileExistsAtPath:outputPDFfileName]){ 
     //removing file 
     if (![[NSFileManager defaultManager] removeItemAtPath:outputPDFfileName error:&pdfDeleteError]){ 

      NSString * errorMessage = [NSString stringWithFormat:@"wk %d Could not remove old pdf files. Error:%@",j, pdfDeleteError]; 
      NSLog(@"%@",errorMessage); 
     } 
    } 

    self.PDFCreator = [NDHTMLtoPDF createPDFWithURL:htmlFileUrl pathForPDF:[outputPDFfileName stringByExpandingTildeInPath] pageSize:kPaperSizeA4 margins:UIEdgeInsetsMake(10, 5, 10, 5) successBlock:^(NDHTMLtoPDF *htmlToPDF) { 
     NSString *result = [NSString stringWithFormat:@"HTMLtoPDF did succeed (%@/%@)", htmlToPDF, htmlToPDF.PDFpath]; 
     NSLog(@"%@",result); 
     self.resultLabel.text = result; 
    } errorBlock:^(NDHTMLtoPDF *htmlToPDF) { 
     NSString *result = [NSString stringWithFormat:@"HTMLtoPDF did fail (%@)", htmlToPDF]; 
     NSLog(@"%@",result); 
     self.resultLabel.text = result; 
    }]; 
} 

しかし、それは

でクラッシュ

スレッド1:EXC_BAD_ACCESS(コード= EXC_I386_GPFLT)githubのに

リンク: https://github.com/iclems/iOS-htmltopdf

しかし、forループをボタンを押したままにすると(1秒に1回この機能が起動されます)、アプリケーションはクラッシュしません。

答えて

0

は、私はあなたがforループ内のブロックを使用しているので、あなたのループのクラッシュがあると思い

それでは、ここで起こることは通話の別の反復が、それは前のブロックの呼び出し

そうにブロックを完了する前に、ということですここでは、iOSのdispatch_group機能を使用して、順番に呼び出すのではなく、別のスレッドで呼び出すことができます。

これを実現するには、ブロックパラメータで1つのメソッドを作成し、このように、

- (void)blockTask:(NSString*)strPath 
{ 
    dispatch_group_enter(serviceGroup); 
    self.PDFCreator = [NDHTMLtoPDF createPDFWithURL:htmlFileUrl pathForPDF:[outputPDFfileName stringByExpandingTildeInPath] pageSize:kPaperSizeA4 margins:UIEdgeInsetsMake(10, 5, 10, 5) successBlock:^(NDHTMLtoPDF *htmlToPDF) { 
     NSString *result = [NSString stringWithFormat:@"HTMLtoPDF did succeed (%@/%@)", htmlToPDF, htmlToPDF.PDFpath]; 
     NSLog(@"%@",result); 
     self.resultLabel.text = result; 
     dispatch_group_leave(serviceGroup); 

    } errorBlock:^(NDHTMLtoPDF *htmlToPDF) { 
     NSString *result = [NSString stringWithFormat:@"HTMLtoPDF did fail (%@)", htmlToPDF]; 
     NSLog(@"%@",result); 
     self.resultLabel.text = result; 
     dispatch_group_leave(serviceGroup); 
    }]; 

} 

注:これだけの擬似コードかもしれないが、エラー、dispatch_groupチュートリアルチェックhere

+0

については は、うーん... – user1872384

+0

そこにいるUIコードを動作しません含まれています...ので、私は実際に実行することはできませんそれは例えばバックグラウンドでself.webview = [[UIWebView alloc] initWithFrame:self.view.frame]; – user1872384

関連する問題