我想在后台线程上发出一个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
的分配会怎样?我有泄漏吗?答案 0 :(得分:1)
Cocoa线程通常不包括强制线程中止的想法。你会看到一个cancel
方法,但这是严格的建议。我们的想法是,线程中的代码将定期检查此状态,并在请求取消时提前退出。例如,您会在NSThread
和NSOperation
中看到这一点。如果代码未检查取消请求,则cancel
方法无效。
因此,如果要处理取消,则需要添加取消请求的检查。如果您看到请求取消,则可以在实际完成线程之前执行所需的任何清理。但是你无论如何都无法中断正在进行的获取请求 - 一旦你调用了方法来启动它,你就等到它完成了。
另外请注意,您的提取需要多长时间,实际上您需要担心这种情况?