代码之家  ›  专栏  ›  技术社区  ›  Kiron

无法使用线程在NSMutableArray中搜索

  •  0
  • Kiron  · 技术社区  · 12 年前

    我有两条数据 NSArray .我必须在里面搜索 不可变数组 .现在我要分开 不可变数组 并在单独的线程中搜索它们,否则需要很长时间。我可以搜索数据,但无法将其合并到另一个数据中 不可变数组

    例如,如果我搜索“a”,我会得到所有线程中带有“a”的所有结果。但是这些线程的结果不能合并为一个 不可变数组

    我使用的代码如下

    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 回复  |  直到 12 年前
        1
  •  1
  •   Jason Fuerstenberg    12 年前

    我假设搜索逻辑的处理强度足够大(即使是针对NSArray的单个元素),足以保证拥有许多线程。

    您描述的解决方案会起作用,但在您的目标中,您需要有一个同步的NSMutableArray来接收匹配的记录。根据匹配率的不同,同步可能会使事情陷入瓶颈。

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

        2
  •  0
  •   Jason Fuerstenberg    12 年前

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

    - (void) searcherDidFindMatch: (id) match {
        [self lazyInitMatchesArray]; // init your NSMutableArray lazily here
        @synchronized(_matchesArray) {
            [_matchesArray addObject: match];
        }
    }
    
        3
  •  0
  •   bbum    12 年前

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

    但是,好吧,这是可能发生的。在这种情况下,我会将数组拆分为N个部分,并将search-each-N排队到一个并发队列中,使用信号量等来限制同时进行的搜索次数。我会将结果收集到N个数组中,然后,如果必要,使用 NSMutableArray addObjectsFromArray: (速度非常快)。