Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/102.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何使用Alamofire Swift 3返回数组的值?_Ios_Swift3 - Fatal编程技术网

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

Ios 如何使用Alamofire Swift 3返回数组的值?,ios,swift3,Ios,Swift3,我的目标是在Alamofire准备好完成任务时返回一个值。 下面的脚本是我的singleton的一部分,它将由我的viewController调用。我环顾四周,有一些例子说明了如何使用Alamofire实现完成处理程序 Singleton: func getPeople() -> [Person] { var persons:[Person] = [] Alamofire.request(requestURL, method: .get, parameters: nil

我的目标是在Alamofire准备好完成任务时返回一个值。 下面的脚本是我的singleton的一部分,它将由我的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

}
ServerManager.sharedInstance.getPeople(
            success: { people in
                //use people here, update UI if needed
            },
            failure: { error in
                //show an error
        })
因为Alamofire将是asynchroon,所以我不会返回Person数组。如何将值
persons
返回到从我的
viewcontroller.swift
调用的函数?我用的是Swift 3


提前感谢。

为此,您应该使用闭包:

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
}
用法:

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

}
ServerManager.sharedInstance.getPeople(
            success: { people in
                //use people here, update UI if needed
            },
            failure: { error in
                //show an error
        })
您可以在swift中阅读有关闭包的更多信息,但我将对您的特殊情况作一些解释:

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

关于
((错误)->Void)?
故障关闭也是如此。如果调用它,必须传递一个
Error
对象来描述实际出错的地方

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

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

另外,您还可以设计方法,使其只有一个
完成
回调,并带有两个选项:

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

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

您能告诉我成功和失败参数的情况吗?我知道如果请求成功就会调用succes,如果请求失败就会调用failure,但是使用
(([People])->Void?
((Error)->Void)?
对我来说不清楚,知道吗?@Caspert我刚刚更新了关于闭包的更多细节。谢谢你的解释。我唯一不明白的是,在结束时你应该通过零吗?你有这样的例子吗。因为如果我理解,Void默认不会返回任何内容?@Caspert:检查更新,我添加了一些关于可选闭包的详细信息。感谢您的时间和解释。这对我来说清楚多了!我会试试看。谢谢