0

に 2 ラックのデータがありNSArrayます。私はその中で検索する必要がありNSArrayます。現在、これNSArrayを分割して別のスレッドで検索しています。そうしないと、時間がかかります。データを検索することはできますが、別のデータに結合することはできませんNSArray

たとえば、「a」を検索すると、すべてのスレッドで「a」を含むすべての結果が得られます。ただし、これらのスレッドの結果を 1 つのNSArray.

私が使用したコードは次のとおりです

NSArray *subArray = [mArrayOrginalData subarrayWithRange:range]; 
                SearchOperation *anOperation = [[SearchOperation alloc]init];
                [anOperation setSearchData:[subArray mutableCopy]];
                [anOperation setPattern:txtFieldPattern.text];
                [anOperation setTarget:self];
                [anOperation setAction:@selector(searchResultHandler:)];
                [searchQueue addOperation:anOperation];

データを取得するためのコードは別のクラス (NSOperation) であり、コードは以下のとおりです。

@implementation SearchOperation

- (void) main{
    
    NSLog(@"%s",__PRETTY_FUNCTION__);
    
    NSMutableArray* mArrayTmp = [Search searchByPattern:self.pattern inputArray:searchData];
    NSLog(@"Sub result count : %d",[mArrayTmp count]);
    [target performSelector:action withObject:mArrayTmp];
}

@@end
4

3 に答える 3

1

私は、検索ロジックが(NSArrayの単一の要素に対してさえ)十分に処理集約的であり、多くのスレッドを持つことを保証すると想定しています。

説明したソリューションは機能しますが、ターゲットでは、一致するレコードを受信するために同期されたNSMutableArrayが必要です。同期は、一致率によってはボトルネックになる場合があります。

まだ実行していない場合は、GCDを利用できるように、NSOperationQueueを介してこれらのNSOperationsを実行してください。

于 2012-09-05T05:07:26.747 に答える
0

配列をサブ配列に分割し、スレッドで検索することでパフォーマンスが向上する検索機能があるとは思えません。データ モデルを再検討する必要があるようです。

しかし、OK、それは起こる可能性があります。その場合、配列を N 個の部分に分割し、セマフォなどを使用して、発生する同時検索の数を制限して、各 N 個の検索を同時キューに入れます。結果を N 個の配列に収集し、必要に応じて を使用してそれらを 1 つNSMutableArrayの配列にまとめますaddObjectsFromArray:(これは非常に高速です)。

于 2012-09-05T05:57:04.703 に答える
0

私が知る限り、あなたのコードは良さそうです。あなたの観測対象はこのようなものになるでしょう...

- (void) searcherDidFindMatch: (id) match {
    [self lazyInitMatchesArray]; // init your NSMutableArray lazily here
    @synchronized(_matchesArray) {
        [_matchesArray addObject: match];
    }
}
于 2012-09-05T05:15:59.700 に答える