NSFetchedResultsController executeFetch для фонового потока - PullRequest
8 голосов
/ 01 августа 2011

Я должен выполнить выборку через NSFetchedResultsController в фоновом потоке.

Мое текущее решение структурировано так:

dispatch_queue_t fetchQueue = dispatch_queue_create("backgroundfetching", NULL);

dispatch_async(fetchQueue,^{
    // 1. Create NSManagedObjectContext
    // 2. Create NSFetchRequest
    // 3. Create NSFetchedResultsController
    // 4. PerformFetch

    dispatch_async(dispatch_get_main_queue(),^{
        [[self table] reloadData];
    });
});

dispatch_release(fetchQueue);

Мои первые тесты прошли успешно, но это то, чтоподходящий способ?

Ответы [ 2 ]

5 голосов
/ 01 августа 2011

Поскольку контроллер извлеченных результатов предназначен для управления данными, которые определяют представление таблицы, он принадлежит потоку / операции переднего плана, на которой выполняется пользовательский интерфейс.Довольно бессмысленно помещать его в фоновый поток, так как вы потеряете все преимущества его использования.

Я также был бы обеспокоен последствиями отправки сообщений делегата FRC через асинхронные потоки.Я не уверен, насколько надежным это будет.

Сказав все это, эскиз вашей реализации выглядит хорошо, насколько это возможно.

1 голос
/ 13 сентября 2011

Я полагаю, что в этом подходе что-то принципиально не так, когда вы разделяете управляемые объекты между потоками (вы выбираете объекты в одном потоке и ссылаетесь на них в основном потоке).На практике это будет работать, но иногда приведет к сбоям.Потому что Apple ясно дает понять, что единственным способом совместного использования управляемых объектов между потоками является использование метода objectWithID: или уведомлений MOCDidSave.

Из Руководства по программированию базовых данных :

Вы выбираете в одном контексте управляемого объекта в фоновом потоке и передаете идентификаторы выбранных объектов в другой поток.Во втором потоке (обычно в основном потоке приложения, чтобы вы могли затем отобразить результаты) вы используете второй контекст для сбоя в объектах с этими идентификаторами объектов (вы используете objectWithID: для создания экземпляра объекта).

...