2016-01-06 2 views
0

У меня есть две модели, наследуя от PFObject:Выполните действия, когда все ответы получены из Parse

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

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{.... 

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

Я нашел это StackOverflow пост: Checking for multiple asynchronous responses from Alamofire and Swift

Является ли это правильный подход для использования Разбор и PFRelation?

+0

Вы можете сделать свой следующий запрос в блоке предыдущего. Пожалуйста, проверьте мой ответ на аналогичную проблему. Http://stackoverflow.com/a/34434276/4170419 – Meanteacher

ответ

1

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

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 
    } 
} 
Смежные вопросы