如何使用Alamofire Swift 3返回数组的值?

时间:2016-10-24 17:27:41

标签: ios swift3

我的目标是在Alamofire完成任务时返回一个值。 下面的脚本是我的单例的一部分,将由我的viewController调用。我环顾四周,有一些例子说明Alamofire实现了完成处理程序。

的Singleton:

func getPeople() -> [Person] {

    var persons:[Person] = []

    Alamofire.request(requestURL, method: .get, parameters: nil, encoding: URLEncoding.default, headers: nil).responseJSON { (response) in
        if let json = response.result.value as? Dictionary<String, Any> {

            for field in json {
                // Reference to person class
                let person = Person()

                // Properties will be fill in
                ...
                ...

                // Add properties to the person object
                persons.append(person)

           }

        }

    }
    return persons

}

的viewController

我将在我的ViewController.swift中调用上面的函数并将其添加到People的数组中。

var persons = [Person]()

override func viewDidLoad() {
    super.viewDidLoad()

    let request = requestHandler()
    self.persons = request.getPeople()
}

因为Alamofire将是asynchroon,所以我不能归还一系列人。如何将值persons返回到从viewcontroller.swift调用的函数?我正在使用Swift 3。

提前谢谢。

1 个答案:

答案 0 :(得分:1)

您应该使用闭包

func getPeople(success: (([Person])->Void)?, failure: ((Error)->Void)?) {
    //create Alamofire request
    //if everything was fine call success block with people array passed into it
    //if failure occurred, call failure block with error.
    //In any case you must call either `success` of `failure` here
}

<强>用法:

ServerManager.sharedInstance.getPeople(
            success: { people in
                //use people here, update UI if needed
            },
            failure: { error in
                //show an error
        })

你可以在swift here中阅读更多关于闭包的内容,但我会就你的具体情况留下一些解释:

基本上,(([Person])->Void)?是一种闭包。这意味着闭包将接受Person个对象的数组,并且不返回任何内容(Void)。 ?最后意味着它是一个可选参数,因此如果您根本不对回调感兴趣,则可以在调用nil函数时传递getPeople

关于((Error)->Void)?失败关闭的相同内容。如果你调用它,你必须传递一个Error对象来描述实际出错的地方。

为什么闭包应该是可选的?

例如,您有一个端点用于将用户的位置发送到服务器。有时您会希望在请求完成后运行一些代码,有时您不关心它是否失败(您只是在背景中发送坐标)。如果您不需要回调,则可以传递空闭包或零。事实上,使用像{ _ in }这样的空闭包并没有错,但如果你传递nil它会更清晰。你也可以在一些UIKit方法中遇到可选的闭包:

present(_:animated:completion:)

animate(withDuration:animations:completion:)

P.S。您还可以设置方法,使其具有仅有一个 completion回调,其中包含两个选项:

func getPeople(completionHandler: (([Person]?, Error?)->Void)?) {}

就我个人而言,我更喜欢两个闭包,因为它更加明显和可读,尽管这是一个品味问题。