完成处理程序 - Parse + Swift

时间:2015-11-14 03:32:27

标签: ios swift parse-platform

我试图生成一个名为' areaList'的PFObject数组。我已经对此进行了相当多的研究,并且理解我可以使用完成处理程序来处理加载结果的异步性质。具体来说,我的问题是要对我做错了什么以及如何实现结果的潜在提示进行一些指导"更好"。

这是我的查询函数,带有完成处理程序:

    func loadAreasNew(completion: (result: Bool) -> ()) -> [Area] {
        var areaList = self.areaList
        let areaQuery = PFQuery(className: "Area")
        areaQuery.findObjectsInBackgroundWithBlock {
            (areas: [PFObject]?, error: NSError?) -> Void in
            if error == nil {
                for area in areas! {
                    let areaToAdd = area as! Area
                    areaList.append(areaToAdd)
//                    print(areaList)  // this prints the list each time
//                    print(areaToAdd)  // this prints the converted Area in the iteration
//                    print(area)  // this prints the PFObject in the iteration
                    if areaList.count == areas!.count {
                        completion(result: true)
                    } else {
                        completion(result: false)
                    }
                }
            } else {
                print("There was an error")
            }
        }
        return areaList
    }

以下是我试图在viewDidLoad中调用它的方式:

loadAreasNew { (result) -> () in
    if (result == true) {
        print(self.areaList)
    } else {
        print("Didn't Work")
    }
}

我在viewDidLoad:

之前分配了这个变量
var areaList = [Area]()

在控制台中,我得到以下内容:

Didn't Work
Didn't Work
Didn't Work
Didn't Work
[]

在Parse中代表我知道的5个项目...

3 个答案:

答案 0 :(得分:2)

这是一个有趣的问题。首先,PFQuery基本上有一个内置的完成处理程序,这很安静!您可能知道,areaQuery.findObjectsInBackgroundWithBlock {...}中的所有代码都会触发 AFTER 服务器响应。完成通常用于创建块的目的,具有异步返回数据和错误的能力。

最佳做法是(IMO)在您的区域附加循环之后立即调用您想要使用PFQuery结果的代码(因为我很挑剔,所以我会选择这样做),就像这样:

     func loadAreasNew() {
        var areaList = self.areaList
        let areaQuery = PFQuery(className: "Area")
        areaQuery.findObjectsInBackgroundWithBlock {
            (areas: [PFObject]?, error: NSError?) -> Void in
            if error == nil {
                let areasFormatted = areas! As [Areas]
                areasList += areasFormatted
                //Something like this
                self.codeINeedAreasFor(areasList)
                }
            } else {
                print(error)
            }
        }
    }

无论其!如果确实认为需要使用某些完成处理程序,请查看this other answer以获取有关如何使用它们的更多信息。但请记住,所有工具都有时间和地点......

答案 1 :(得分:1)

这里有一些问题。

您的完成处理程序不需要您为完成处理程序的参数定义名称,因此您可以轻松使用completion: (Bool) -> ()

此外,在您的函数中,您将返回areaList。这应该像这个onComplete(areaList)一样通过完成处理程序,并更改你的完成处理程序参数以期望你的区域列表。

然后,当你调用你的函数时,它看起来更像是这样:

loadAreasNew { result in
    if (result == true) {
        print(self.areaList)
    } else {
        print("Didn't Work")
    }
}

答案 2 :(得分:1)

以下是我的担忧:

1)不要传入局部变量并让函数返回它,它没有意义和危险。

您可能想要启动一个空数组并进行提取,然后“返回”它。

2)获取请求在后台处理,你不知道什么时候会完成。如果立即返回数组,它将始终为空数组。

也可以在完成中加入“返回”。

3)Parse已经有一个距离检查方法,你不必手动完成。 aPARSEQUERRY.where(标号:,nearGeoPoint:,inKilometers:)

我将把这个函数重写为:

List<string>