2012-09-05 35 views
0

我在NSArray中有2个lacs数据。我必须在那里搜索NSArray。目前我正在拆分这NSArray并在不同的线程搜索他们,这将需要很长时间。我能够搜索数据,但无法将其与另一个NSArray结合。无法使用线程在NSMutableArray中进行搜索

例如,如果我搜索“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 

回答

0

您的代码看起来不错,我可以告诉。 你的观察目标将有这样的事情......

- (void) searcherDidFindMatch: (id) match { 
    [self lazyInitMatchesArray]; // init your NSMutableArray lazily here 
    @synchronized(_matchesArray) { 
     [_matchesArray addObject: match]; 
    } 
} 
+0

这会起作用,但事后合并可能会更快。 – bbum

1
给出

代码我假设搜索逻辑是处理足够密集(即使对你的NSArray的单个元素),以保证有很多线程。

您所描述的解决方案将工作,但在您的目标中,您需要有一个同步的NSMutableArray来接收匹配的记录。取决于匹配率,同步可能会造成瓶颈。

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

+0

我正在使用NSOperationQueue。你能否解释一下Jason如何实现它,其实我有点困惑。 – Kiron

0

听起来可疑,你有一个搜索功能,其中拆分阵列成子阵列和线程搜索是一个性能取胜。听起来好像可能需要重新访问数据模型。

但是,好的,它可以发生。在这种情况下,我会将数组拆分为N个部分,并使用信号量或类似方法将搜索每个N排入并发队列,以限制发生的同时搜索次数。我会将结果收集到N个数组中,然后,如果有必要,使用NSMutableArrayaddObjectsFromArray:(这是非常快的速度)将它们求和成单个数组。