1

多数のファイルに対して複雑な操作を実行する必要があります。幸いなことに、列挙の順序は重要ではなく、ジョブはロックせずに並行して実行できます。

プラットフォームはこれを行う方法を提供していますか? より良い API がないため、次のことを考えていました。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    NSArray *paths = [[NSFileManager defaultManager] subpathsAtPath:folder];
    [paths enumerateObjectsWithOptions:NSEnumerationConcurrent 
    usingBlock:^(NSString *path, NSUInteger idx, BOOL *stop) {
        // Complex operation
    }];
}];

より良い方法はありますか?

4

2 に答える 2

1

現在のコードは、グローバル キューに 1 つのブロックを配置します。そのため、その 1 つのブロックがバックグラウンド スレッドで実行され、すべての反復と処理が行われます。

処理タスクを同時に実行するために、少し異なることをしたいと考えています。実際には、メイン スレッドで反復を実行し、ループの各反復でグローバル キューにブロックを追加する必要があります。

NSOperationより良いのは、サブクラスを作成することです。そこにあなたのロジックを入れてください。ループ内で操作のインスタンスを作成し、それらを操作キューに追加します。これは高レベルの API であり、依存関係の追加、最大同時実行数の調整、まだ完了していない操作の数の確認などのオプションを提供します ...

于 2013-10-19T17:58:53.150 に答える
1

考えられるアプローチを次に示します。数万のファイルがある (またはある可能性がある) 場合は、列挙する代わりにenumerateObjectsWithOptions:usingBlock:、配列を手動でバッチで列挙することをお勧めします (それぞれ 100 要素としましょう)。現在のバッチの実行が完了したら (ディスパッチ グループを使用して確認できます)、次のバッチを開始します。このアプローチにより、何万ものブロックをキューに追加することを回避できます。

ところで、間違っていたため、以前の回答を削除しました。

于 2013-10-19T18:17:10.103 に答える