Выполнение запроса на выборку в другом потоке

#cocoa #core-data

#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:amp;error]];

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

Вопросы:

  • Если пользователь хочет отменить поиск, каким был бы правильный способ завершить фоновый поток?
  • Если я прерву поток во время managedObjectContext текущей выборки, что произойдет с выделением fetchRequest ? Будет ли у меня утечка?

Комментарии:

1. возможно, вас заинтересует эта серия статей: cimgf.com/2011/05/04/core-data-and-threads-without-the-headache

Ответ №1:

Потоковая обработка Cocoa обычно не включает идею принудительного прерывания потока. Вы увидите cancel метод, но это строго рекомендательный. Идея заключается в том, что код в потоке будет периодически проверять это состояние и завершаться досрочно, если была запрошена отмена. Вы увидите это, например, в NSThread и NSOperation . Если код не проверяет наличие запроса на отмену, cancel метод не имеет эффекта.

Из-за этого вам нужно будет добавить проверки для запроса на отмену, если вы хотите обработать отмену. Если вы видите, что была запрошена отмена, вы можете выполнить любую необходимую вам очистку перед фактическим завершением потока. Но вы все равно не можете прервать выполнение запроса на выборку — после того, как вы вызвали метод для его запуска, вы ждете, пока он завершится.

Отдельно отметим, сколько времени занимает ваша выборка, что вам действительно нужно беспокоиться об этой ситуации?