Создание зависимостей внутри NSOperation - PullRequest
2 голосов
/ 19 июня 2011

У меня довольно сложный процесс загрузки, который я хочу выполнить в фоновом потоке.Есть некоторые естественные зависимости между шагами в этом процессе.Например, мне нужно завершить загрузку таблиц А и В, прежде чем устанавливать отношения между ними (я использую базовые данные).

Сначала я подумал о том, чтобы поместить каждый зависимый шаг в свою собственную операцию NSOperation,затем создайте зависимость между двумя операциями (то есть загрузите две таблицы в одной операции, затем установите связь между ними в следующей, зависимой операции).Однако для каждой операции NSO требуется свой собственный NSManagedContext, так что это не хорошо.Я не хочу сохранять фоновый контекст, пока обе таблицы не будут загружены и их отношения не установлены.

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

Я новичок в iOS, однако, прежде чем я решусь пойти по этому пути, я не возражаю против совета о том,пришел к правильному выводу.

1 Ответ

0 голосов
/ 20 июня 2011

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

Вы, по сути, захотите сделать две выборки проводов, чтобы получить весь требуемый набор данных, а затем объединить данные и проанализировать их одновременно в Core Data.

Если вы собираетесь использовать асинхронные API-интерфейсы, это, по сути, означает структурирование класса, который ожидает завершения обеих операций, а затем запускает еще одну NSOperation или блок, который выполняет синтаксический анализ и построение отношений.

Представьте себе этот порядок событий:

  1. Пользователь выполняет некоторые действия (нажатие кнопки и т. Д.)
  2. Селектор для этого действия запускает два сетевых запроса
  3. Когда оба запроса завершены (они оба уведомляют общего делегата), запустите операцию разбора

Может выглядеть примерно так в коде:

- (IBAction)someAction:(id)sender {
    //fire both network requests
    request1.delegate = aDelegate;
    request2.delegate = aDelegate;
 }

 //later, inside the implementation of aDelegate
 - (void)requestDidComplete... {
   if (request1Finished && request2Finished) {
       NSOperation *parse = //init with fetched data
       //launch on queue etc.
   }
 }

Существует два основных подводных камня, к которым склонно это решение:

  1. Хранит весь набор данных в памяти до тех пор, пока оба запроса не будут завершены.
  2. Вам придется постоянно включать конкретный запрос, вызывающий вашего делегата (для обработки ошибок, успеха и т. Д.)

По сути, вы реализуете зависимости операций самостоятельно, хотя, возможно, из-за структуры NSURLConnection не обойтись без нее.

...