Ios 如何使用Alamofire Swift 3返回数组的值?
我的目标是在Alamofire准备好完成任务时返回一个值。 下面的脚本是我的singleton的一部分,它将由我的viewController调用。我环顾四周,有一些例子说明了如何使用Alamofire实现完成处理程序 Singleton: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
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:检查更新,我添加了一些关于可选闭包的详细信息。感谢您的时间和解释。这对我来说清楚多了!我会试试看。谢谢