0

我在一个NSArray. 我必须在里面搜索NSArray。目前我将其拆分NSArray并在单独的线程中搜索它们,否则需要很长时间。我可以搜索数据,但不能将其与另一个NSArray.

例如,如果我搜索“a”,我会在所有线程中得到所有带有“a”的结果。但是这些线程结果不能合并为一个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 来接收匹配的记录。根据匹配率,同步可能会成为瓶颈。

如果您还没有这样做,请通过 NSOperationQueue 运行这些 NSOperations,以便从 GCD 中受益。

于 2012-09-05T05:07:26.747 回答
0

据我所知,您的代码看起来不错。你的观察目标会有这样的东西......

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

听起来令人怀疑,您有一个搜索功能,其中将数组拆分为子数组并在线程中搜索是性能上的胜利。听起来可能需要重新审视您的数据模型。

But, OK, it can happen. In that case, I'd split the array into N parts and enqueue the search-each-N into a concurrent queue, using a semaphore or like to limit the # of simultaneous searches occurring. I would collect the results into N arrays and then, if necessary, summate them into a single array using NSMutableArray's addObjectsFromArray: (which is pretty darned fast).

于 2012-09-05T05:57:04.703 回答