0

これは私の検索機能です:

- (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;
}

通常、このような結果が得られます:</p>

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

数回検索を続けると、正常に戻りました。そしてまた奇妙に... それは私を当惑させます。

さまざまなマルチスレッド方法を試すために何日も費やしましたが、結果は同じです。
私を助けてください!ありがとうございました!

4

1 に答える 1

2

Core Data はスレッドセーフではありません。NSManagedObjectContextバックグラウンド スレッドで独自のスレッドを作成する必要があります。これにより、バックグラウンドで検索を実行できます。その場合、管理対象オブジェクトを直接メイン スレッドに単純に送信することはできません。オブジェクト ID を送信し、メイン スレッドでそのobjectWithID:メソッドを使用してメイン コンテキストからそれらのオブジェクトを取得する必要があります。

于 2012-07-05T05:51:58.253 に答える