这是我的搜索功能:
- (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
继续搜索几次,恢复正常。再奇怪...... 这让我很困惑。
我花了很多天尝试不同的多线程方法,结果仍然相同。
请帮帮我!谢谢!
答案 0 :(得分:2)
核心数据不是线程安全的。您需要在后台线程上创建自己的NSManagedObjectContext
。有了这个,你可以在后台进行搜索。然后,您不能简单地将托管对象直接发送到主线程。您必须使用其objectWithID:
方法从主要上下文中为对象ID提供对象ID。