在另一个线程上执行获取请求

时间:2011-06-02 15:39:28

标签: cocoa core-data

我想在后台线程上发出一个CoreData获取请求,以便为用户提供取消它的选项。

以下是我的后台线程代码:

- (void)searchDailyNotes
{
    NSEntityDescription *entity = [NSEntityDescription
            entityForName:@"DailyNotes"
            inManagedObjectContext:self.managedObjectContext];

    NSString *searchString = [self.searchTextField stringValue];
    NSFetchRequest *fetchRequest= [[NSFetchRequest alloc] init];
    NSPredicate *predicate = [NSPredicate
            predicateWithFormat:@"notes contains[cd] %@", searchString];
    [fetchRequest setEntity:entity];
    [fetchRequest setPredicate:predicate];

    NSError *error = nil;
    [_dailyNotesArray addObjectsFromArray:
            [self.managedObjectContext
             executeFetchRequest:fetchRequest
             error:&error]];

    NSLog(@"dailynotesArray count: %lu", [_dailyNotesArray count]);
    if(error){
        [NSApp presentError:error];
    }
    [fetchRequest release];
}

问题:

  • 如果用户想要取消搜索,那么终止后台线程的正确方法是什么?
  • 如果我在managedObjectContext当前正在提取时中止线程,那么fetchRequest的分配会怎样?我有泄漏吗?

1 个答案:

答案 0 :(得分:1)

Cocoa线程通常不包括强制线程中止的想法。你会看到一个cancel方法,但这是严格的建议。我们的想法是,线程中的代码将定期检查此状态,并在请求取消时提前退出。例如,您会在NSThreadNSOperation中看到这一点。如果代码未检查取消请求,则cancel方法无效。

因此,如果要处理取消,则需要添加取消请求的检查。如果您看到请求取消,则可以在实际完成线程之前执行所需的任何清理。但是你无论如何都无法中断正在进行的获取请求 - 一旦你调用了方法来启动它,你就等到它完成了。

另外请注意,您的提取需要多长时间,实际上您需要担心这种情况?

相关问题