我的目标是在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。
提前谢谢。
答案 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)?) {}
就我个人而言,我更喜欢两个闭包,因为它更加明显和可读,尽管这是一个品味问题。