在后台线程中搜索核心数据,函数随机终止

时间:2012-07-04 16:37:14

标签: ios multithreading search core-data nsthread

这是我的搜索功能:

- (void)searchingMethod:(NSString *)aText{
    NSManagedObjectContext *context = [self managedObjectContext];
    NSEntityDescription *entity = [NSEntityDescription 
         entityForName:@"Entity" inManagedObjectContext:context];
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    [fetchRequest setEntity:entity];
    NSPredicate *predicate = [NSPredicate 
          predicateWithFormat:@"word LIKE %@", 
          [searchBar.text lowercaseString]];
    [fetchRequest setPredicate:predicate];
    //fetching array
    NSLog(@"Place 1");
    NSArray *wordArray = [context 
    executeFetchRequest:fetchRequest 
    error:nil];
    NSLog(@"Place 2");

    [self performSelectorOnMainThread:@selector(refreshTableView:) 
                             withObject:wordArray waitUntilDone:NO];
    NSLog(@"Searching End");
}

我用这种方法调用搜索功能:

- (void)searchBar:(UISearchBar *) searchBar textDidChange:(NSString *)Tosearch{
if([[searchBar text] length] >0)
{
    NSThread *aThread = [[NSThread alloc] 
        initWithTarget:self 
        selector:@selector(searchingMethod:) 
        object:searchBar.text];
    [aThread start];
}
else
{ 
    //others...
}
return;
}

通常,我会得到这样的结果:

2012-07-05 00:04:46.706 MyApp[2376:207] Place 1
2012-07-05 00:04:46.783 MyApp[2376:207] Place 2
2012-07-05 00:04:46.823 MyApp[2376:207] searching End

执行搜索方法十几次后,它停在此位置。

2012-07-05 00:11:42.174 MyApp[2376:207] Place 1

继续搜索几次,恢复正常。再奇怪...... 这让我很困惑。

我花了很多天尝试不同的多线程方法,结果仍然相同。
请帮帮我!谢谢!

1 个答案:

答案 0 :(得分:2)

核心数据不是线程安全的。您需要在后台线程上创建自己的NSManagedObjectContext。有了这个,你可以在后台进行搜索。然后,您不能简单地将托管对象直接发送到主线程。您必须使用其objectWithID:方法从主要上下文中为对象ID提供对象ID。