0

私はいくつかのSFTP機能を含む小さな無料のCocoaアプリに取り組んでおり、特にアップロードを扱っています。アプリは完成に近づいていますが、多くのファイルを含むフォルダーのアップロードに関して、かなり悪い問題が発生しました。

アップロードを処理するためにConnectionKitを使用しています。

CKTransferRecord * record;
record = [connection recursivelyUpload:@"/Users/me/large-folder" 
                                    to:@"/remote/directory"];

これは、ほとんどのファイルとフォルダーで正常に機能します。この場合、@ "/ Users / me/large-folder"には300を超えるファイルが含まれています。このメソッドを呼び出すと、CPUが約30秒間100%まで回転し、アプリケーションが応答しなくなります(mac回転ボール)。30秒後、アップロードはキューに入れられて正常に機能しますが、これはほとんど理想的ではありません。明らかに、これらのファイルを列挙しているものは何でも、それが完了するまで私のアプリをロックアップさせています。

これについてどうしたらいいのかよくわかりません。私はほぼすべてのソリューションを受け入れています。別のフレームワークを使用していても、調査を行った結果、ConnectionKitはそこにあるものの中で最高のようです。

何か案は?

4

2 に答える 2

1

問題はほぼ確実に列挙型にあるため、列挙型を非同期アクションに移動する必要がある可能性があります。ほとんどの場合、彼らはNSFileManager -enumeratorAtPath:これに使用しています。それが主な問題である場合、最善の解決策は、その作業を独自のスレッドに移すことです。非常に長い時間がかかっていることを考えると、列挙中に実際にファイルを読み取っていると思います。その解決策は、アップロードする直前にファイルを怠惰に読み取ることです。

Peterは、Sharkが役立つことは正しいですが、Sharkの長年のファンであった後、Instrumentsはより有用な回答をより迅速に提供する傾向があることがわかりました。Instrumentsを使用すると、ディスクI/Oとメモリ割り当てトラックをCPUサンプラーに簡単に追加できます。

1つのコアだけを100%でブロックしている場合は、アクティブスレッドを「メインスレッド」に設定し、サンプルパースペクティブを「すべてのサンプルカウント」に設定することをお勧めします。すべてのコアを100%でブロックしている場合は、アクティブスレッドを「すべてのスレッド」に設定し、サンプルパースペクティブを「実行中のサンプル時間」に設定することをお勧めします。

于 2009-08-10T16:39:52.073 に答える
1

シャークを使用。サンプリングを開始し、ダウンロードを開始し、ハングが終了したらすぐにサンプリングを停止します。

問題が ConnectionKit にあることが出力で確認された場合は、次の 2 つの選択肢があります。

  1. 別のものに切り替えます。
  2. ハングしないようにするパッチを提供してください。

オープンソースの利点は、#2 が可能であることです。それは私が推奨するものです。そうすれば、高速な ConnectionKit が得られるだけでなく、メンテナーがパッチを受け入れると、CK を使用する他のすべての人も 1 つを持つことができます。

そして、Shark が問題が ConnectionKit にないことを明らかにした場合(プロファイリングのルール 2:驚かれることでしょう)、アプリの修正方法に関する Shark のガイダンスがあります。

于 2009-08-09T22:31:36.630 に答える