Это может быть вопросом личного вкуса, но мне нравится определять и использовать шаблоны запросов на выборку. Тогда вы можете сделать что-то вроде этого:
Bookshop *bookshop = (Bookshop *) nsManagedObjectFromOwner;
NSString *searchTerm = @"cloud";
NSDictionary *substitutionDictionary = [NSDictionary dictionaryWithObjectsAndKeys:bookshop.Name, @"BOOKSHOP_NAME", searchTerm, @"BOOK_NAME", nil];
// BOOKSHOP_NAME and BOOK_NAME are the name of the variables in your fetch request template
NSFetchRequest *fetchRequest = [model fetchRequestFromTemplateWithName:@"YourFetchRequestTemplateName" substitutionVariables:substitutionDictionary];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Books"
inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
Это не меньше кода, но он не такой громоздкий, потому что все ваши запросы на выборку определены в одном месте. Или, может быть, я неправильно понимаю ваш вопрос?
Что касается второй части вашего вопроса, на самом деле я сам этим не пользовался, но NSFetchedResultsControllerDelegate предоставляет методы, необходимые для автоматического обновления таблицы результатов. Попробуйте -controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:
. Очевидно, это подразумевает использование NSFetchedResultsController.