2

Я использую AFNetworking в качестве своего сетевого стека для связи с веб-службой и заполнения локального хранилища данных. Во время прогонов синхронизации у меня есть массив конечных точек API для запуска, и когда этот запуск завершен, я добавляю окончательную операцию, которая заставляет полученный JSON заполнить базу данных.Добавление «окончательного» NSOperation к очереди с неопределенным количеством операций

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

То, как у меня сейчас работает, у меня есть ряд первичных операций, а затем добавьте «окончательную» операцию. За это время праймериз вернулся и вызвал меня, чтобы создать вспомогательные операции, например, так:

* Primary Fetch Operation A 
* Primary Fetch Operation B 
* Final Operation 
* Secondary Fetch Operation B1 

Мне нужно, чтобы выяснить, как обеспечить, чтобы «Final Операция» всегда будет работать в прошлом.

Одна вещь, которую я пробовал, заключается в добавлении наблюдателя к свойству operationCount очереди операции, но, похоже, он может работать до 0 до добавления дополнительной операции.

ответ

4

К сожалению, я считаю, что наблюдатель не будет работать, AFNetworking вызывает обратные вызовы из completionBlock из NSOperation, и это означает, что операция уже завершена, и удаляется из очереди, которая объясняет, почему вы достигли operationCount от 0 до представляет в вторичная операция.

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

+1

Да! Прекрасный ответ, спасибо. Я нашел дополнительную информацию о нескольких реализациях в этом вопросе: http://stackoverflow.com/questions/11909629/waiting-until-two-async-blocks-are-executed-before-starting-another-block –

 Смежные вопросы

  • Нет связанных вопросов^_^