Нужно ли обновлять табличное представление вручную после вызова executeFetch в приложении Core Data? - PullRequest
2 голосов
/ 30 января 2010

Я новичок в этом бизнесе Core Data.

Я подключил UITableViewController к NSFetchedResultsController. В viewDidLoad я запускаю запрос на получение необходимых данных с сервера, затем использую [self.fetchedResultsController performFetch:&error] для обновления представления таблицы. До этого момента все работает нормально.

Теперь я хочу переместить материал выборки данных в другой поток, поэтому после того, как приложение получило объект NSArray от сервера, оно выполняет селектор didFinishFetchingItems в главном потоке. В этом селекторе я сохраняю NSArray в хранилище базовых данных, и fetchedResultsController выполняет выборку. Данные не отображаются, хотя NSLog показывает, что данные все еще там (например, [[fetchedResultsController fetchedObjects] count] возвращает 100). Я должен поставить [self.tableView reloadData] в конце метода, чтобы обновить представление таблицы вручную.

Мой вопрос: что я сделал не так? Зачем мне нужно было обновлять представление таблицы вручную?

Ответы [ 2 ]

2 голосов
/ 31 января 2010

Вы не должны касаться вашего NSFetchedResultsController в неосновном потоке, который не является поточно-безопасной операцией.

Если у вас длительная задержка при получении, вам нужно выполнить фоновую выборку, используя отдельный NSManagedObjectContext. Если вы выполните отдельную выборку в фоновом режиме, она загрузит данные в кеш, а затем NSFetchedResultsController попадет в кеш вместо диска, что ускорит извлечение в основном потоке.

1 голос
/ 30 января 2010

Вам не нужно ничего обновлять вручную; fetchedResultsController сделает это за вас.

Что вам нужно сделать, это реализовать NSFetchedResultsControllerDelegate для некоторого объекта и установить этот объект в качестве делегата для вашего контроллера fetchedresults.

См. это о том, что вам нужно реализовать. Если ваша модель проста, вы можете в значительной степени скопировать этот код в свой делегат, и все работает.

Важно, чтобы и resultcontroller, и другие части кода работали с одним и тем же контекстом управляемого объекта. Вот как контроллер результатов может забрать изменения. Но в Руководстве по основным данным есть несколько предостережений по поводу многопоточности, поэтому убедитесь, что у вас есть основы потоков, и тогда все работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...