从 Parse 检索到所有响应时执行操作
Perform action when all responses are retrieved from 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{....
我的问题是我有一系列食谱,我需要从中获取配料。
我需要组合多个异步响应以在另一个控制器中使用。我需要获取整个成分列表,然后执行 perfromSegueWithIdentifier。
我发现了这个 Whosebug post:
这是使用 Parse 和 PFRelation 的正确方法吗?
基本上你需要并行执行多个任务,并在所有任务完成时得到通知。如果你使用 findObjectsInBackground() which returns a BFTask
. Once you have the array of tasks, you can send them for execution in parallel (more details here):
就可以做到这一点
let tasks = recipes.map { [=10=].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
}
}
我有两个模型,从 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{....
我的问题是我有一系列食谱,我需要从中获取配料。 我需要组合多个异步响应以在另一个控制器中使用。我需要获取整个成分列表,然后执行 perfromSegueWithIdentifier。
我发现了这个 Whosebug post:
这是使用 Parse 和 PFRelation 的正确方法吗?
基本上你需要并行执行多个任务,并在所有任务完成时得到通知。如果你使用 findObjectsInBackground() which returns a BFTask
. Once you have the array of tasks, you can send them for execution in parallel (more details here):
let tasks = recipes.map { [=10=].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
}
}