快速从闭包中获取数据

时间:2015-01-04 15:05:20

标签: ios swift closures

我在解析时发了一个查询并获取了一个GeoPoint坐标数组。这是在封闭内完成的。我只能访问该闭包内的数组值。我需要能够使用这些值,以便它们可以在地图上用作注释,但我无法找到它们。有人可以告诉我如何从闭包中获取数组值。

代码:

var user = PFUser.currentUser()
user["location"] = geopoint

var query = PFUser.query()
query.whereKey("location", nearGeoPoint:geopoint)
query.limit = 10
query.findObjectsInBackgroundWithBlock({ (objects: [AnyObject]!, error: NSError!) -> Void in

    for object in objects {

        var user:PFUser = object as PFUser
        var otherUsersCoord = [PFGeoPoint]()
        otherUsersCoord.append(user["location"] as PFGeoPoint)

        println("The other users coords are: \(otherUsersCoord)")
    }

})}

2 个答案:

答案 0 :(得分:4)

otherUsersCoord声明为闭包表达式之外的var,而不是在其中。当它被分配到闭包内时,该变化将反映在闭包之外的变量中。这被称为“捕获”otherUsersCoord。捕获外部上下文使得闭包不仅仅是函数。

请注意,在变量具有您决定的值之前,您仍需要等待闭包实际运行。它不会立即同步可用。此外,捕获外部变量会使它们保持活动状态并且偶尔会导致循环引用和类似问题(这就是为什么有时当您引用成员变量或函数时会收到关于“捕获自我”的警告)。

答案 1 :(得分:0)

你通常会这样做:

如果闭包在某个辅助类的方法中,则传递一个以数组作为参数的完成块参数。调用完成块时,将数组存储为实例变量(并触发对UI的更新)或创建注释并将它们设置到地图视图(这将是实例变量)。

如果闭包位于拥有地图视图的类的方法中,则可以跳过完成块部分,直接处理数组以更新实例变量/ map。