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

Cocoa 在另一个线程上执行提取请求,cocoa,core-data,Cocoa,Core Data,我想在后台线程上发出CoreData获取请求,以便用户可以选择取消它 下面是我的背景线程代码: - (void)searchDailyNotes { NSEntityDescription *entity = [NSEntityDescription entityForName:@"DailyNotes" inManagedObjectContext:self.managedObjectContext]; NSString *se

我想在后台线程上发出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
    的分配会发生什么变化?我会上厕所吗

Cocoa线程通常不包括强制线程中止的思想。您将看到一个
cancel
方法,但这只是一个建议。其思想是线程中的代码将定期检查此状态,如果已请求取消,则尽早退出。例如,您将在
NSThread
NSOperation
中看到这一点。如果代码未检查取消请求,则
cancel
方法无效

因此,如果您想处理取消,您需要为取消请求添加支票。如果您看到请求取消,您可以在实际完成线程之前执行所需的任何清理。但是无论如何,您都不能中断正在进行的获取请求——一旦您调用了该方法来启动它,您将等待它完成


另一方面,您实际需要担心这种情况的回迁需要多长时间?

Cocoa线程通常不包括强制线程中止的想法。您将看到一个
cancel
方法,但这只是一个建议。其思想是线程中的代码将定期检查此状态,如果已请求取消,则尽早退出。例如,您将在
NSThread
NSOperation
中看到这一点。如果代码未检查取消请求,则
cancel
方法无效

因此,如果您想处理取消,您需要为取消请求添加支票。如果您看到请求取消,您可以在实际完成线程之前执行所需的任何清理。但是无论如何,您都不能中断正在进行的获取请求——一旦您调用了该方法来启动它,您将等待它完成


另一方面,您的回迁需要多长时间才能真正担心这种情况?

您可能对本系列文章感兴趣:您可能对本系列文章感兴趣: