无法使用线程在NSMutableArray中搜索

时间:2012-09-05 04:41:46

标签: iphone objective-c ios5 ios4

我在NSArray中有2个数据。我必须搜索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

3 个答案:

答案 0 :(得分:1)

我假设搜索逻辑处理足够密集(甚至针对NSArray的单个元素)以保证拥有许多线程。

您描述的解决方案将起作用,但在您的目标中,您需要使用同步的NSMutableArray来接收匹配的记录。根据匹配率,同步可能会成为瓶颈。

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

答案 1 :(得分:0)

从我所知道的,你的代码看起来不错。 你的观察目标会有这样的......

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

答案 2 :(得分:0)

听起来很可疑,你有一个搜索功能,将数组拆分为子数组并在线程中搜索是一个性能获胜。听起来可能需要重新访问您的数据模型。

但是,好吧,它可能会发生。在这种情况下,我将数组拆分为N个部分,并将搜索每个N排入并发队列,使用信号量或类似限制同时发生的搜索#。我会将结果收集到N个数组中,然后在必要时使用NSMutableArray的{​​{1}}将它们汇总到一个数组中(这是非常快速的)。