1

私は現在、PDF で動作する Cocoa アプリケーションに取り組んでおり、Apple の PDFKit を使用して作業を行っています。PDF の保存に問題があることがわかりました。保存中にプログレス バーを表示したいのですが、これは標準的なwriteToURL:方法ではできないようです。そこで、代わりにグランドセントラルディスパッチを利用しました。

これに関する問題はdataRepresentation、NSData を書き込むために使用される方法が、3MB を超える PDF を NSData に変換する際に非常に遅いことです。そのため、プログラムがデータを待機している間、進行状況バーが数秒間停止します。プログラムが完全に停止したとユーザーに思わせるため。そして、私は彼らにそれを考えてほしくありません。

私の質問は、dataRepresentationメソッドを高速化するか、その進行状況をユーザーに報告するためにできることはありますか?

私が最終的に書いたGrand Central Dispatchコードは次のとおりです。

NSData *pdf = [doc dataRepresentation]; // R-e-a-l-l-y S-l-o-w

dispatch_queue_t queue = dispatch_get_current_queue();
dispatch_data_t dat = dispatch_data_create([pdf bytes], [pdf length], queue, DISPATCH_DATA_DESTRUCTOR_DEFAULT);

__block dispatch_io_t channel =
dispatch_io_create_with_path(DISPATCH_IO_STREAM,
                             [path UTF8String],     // Convert to C-string
                             O_WRONLY,              // Open for writing
                             0,                     // No extra flags
                             queue,
                             ^(int error){
                                 // Cleanup code for normal channel operation.
                                 // Assumes that dispatch_io_close was called elsewhere.
                                 if (error == 0) {
                                     dispatch_release(channel);
                                     channel = NULL;
                                 }
                             });
// The next two lines make sure that the block in dispatch_io_write
// gets called about 60 times, so that it can update the progress bar.
dispatch_io_set_low_water(channel,[pdf length]/60);
dispatch_io_set_high_water(channel,[pdf length]/60);

dispatch_io_write(channel,
                  0,
                  dat,
                  queue,
                  ^(bool done, dispatch_data_t data, int error) {
                      if (data) {
                          // Increment progress bar
                      }
                      if (error) {
                          // Handle errors
                      }
                      if (done) {
                          dispatch_io_close(channel, NULL);
                      }
                  });
dispatch_release(dat);
dispatch_release(queue);
4

1 に答える 1

2

PDFDocumentDidBeginPageWriteNotification中に送信されるおよびPDFDocumentDidEndPageWriteNotification通知を使用し-writeToURL:ます。通知は、処理中のページを示し、ドキュメント内の合計ページ数と比較して進行状況を表示できます。

于 2013-04-15T13:44:56.480 に答える