Выполнить действие, когда все ответы будут получены из Parse

У меня есть две модели, производные от PFObject:

** Рецепт модели

class Recipe: PFObject, PFSubclassing{
  class func parseClassName() -> String {
    return "Recipe"
  }

 @NSManaged var name: String?
 var toIngredients: PFRelation! {
   return relationForKey("ingredients")
 }
}

** Модель ингредиента:

class Ingredient: PFObject, PFSubclassing{
  class func parseClassName() -> String {
      return "Ingredient"
  }
  @NSManaged var category: String?
  @NSManaged var ingredient: String?
  @NSManaged var amount: NSNumber?
  @NSManaged var unit: String?
}

Я узнал, что получение ингредиентов для одного рецепта будет работать следующим образом:

 let query = recipe.toIngredients.query()
 query.findObjectsInBackgroundWithBlock{....

Моя проблема в том, что у меня есть множество рецептов, из которых мне нужно получить ингредиенты. Мне нужно объединить несколько асинхронных ответов для использования в другом контроллере. Мне нужно получить весь список ингредиентов, а затем выполнить fromSegueWithIdentifier.

Я нашел это сообщение stackoverflow: Проверка нескольких асинхронных ответов от Alamofire и Свифт

Является ли это правильным подходом к использованию Parse и PFRelation?


person Laura Calinoiu    schedule 06.01.2016    source источник
comment
Вы можете сделать свой следующий запрос в блоке предыдущего. Пожалуйста, проверьте мой ответ на аналогичную проблему stackoverflow.com/a/34434276/4170419   -  person Meanteacher    schedule 06.01.2016


Ответы (1)


В основном вам нужно параллельно выполнять несколько задач и получать уведомления, когда все они будут выполнены. Этого можно добиться, если использовать findObjectsInBackground(), который возвращает BFTask. Получив массив задач, вы можете отправить их на выполнение параллельно (подробнее здесь):

let tasks = recipes.map { $0.toIngredients.query().findObjectsInBackground() }
let aggregateTask = BFTask(forCompletionOfAllTasks: tasks)
aggregateTask.continueWithBlock { task in
    if task.error() { 
        // handle the error
    } else {
       // grab the results, perform the seque
    }
}
person Cristik    schedule 06.01.2016