我在程序中的类中有以下函数:
func getXMLForTrips(atStop: String, forRoute: Int, completionHandler: @escaping (String) -> Void) {
let params = [api key, forRoute, atStop]
Alamofire.request(apiURL, parameters: params).responseString { response in
if let xmlData = response.result.value {
completionHandler(xmlData)
} else {
completionHandler("Error")
}
}
}
在类的In it()中,我试图这样调用它:
getXMLForTrips(atStop: stop, forRoute: route) { xmlData in
self.XMLString = xmlData
}
编译时不会出错,但在执行init()之后,类的self.XMLString仍然为nil(由Xcode调试器和稍后由于nil值而崩溃的程序显示)。我看不出这不可行的原因。有人能看到我丢失了什么吗?
最佳答案
你不应该在类的初始值设定项中进行internet调用。在完成internet调用之前,您将到达init方法的返回,这意味着该类可能会使用您试图设置的变量的nil值初始化。
最好,您可以有另一个类,如API客户机、数据源或视图控制器,其中包含这些方法。我不确定使用init()
方法的类被调用了什么,但假设它被调用了Trips
。
class Trips: NSObject {
var xmlString: String
init(withString xml: String) {
xmlString = xml
}
}
然后,一个选项是将另一个代码放在引用该对象的任何类中。
我将使用一个视图控制器作为例子,因为我不知道你在使用什么,因为你只展示了两个方法。
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
//setting some fake variables as an example
let stop = "Stop"
let route = 3
//just going to put that method call here for now
getXMLForTrips(atStop: stop, forRoute: route) { xmlData in
//initialize Trip object with our response string
let trip = Trip(withString: xmlData)
}
}
func getXMLForTrips(atStop: String, forRoute: Int, completionHandler: @escaping (String) -> Void) {
let params = [api key, forRoute, atStop]
Alamofire.request(apiURL, parameters: params).responseString { response in
if let xmlData = response.result.value {
completionHandler(xmlData)
} else {
completionHandler("Error")
}
}
}
}
如果您希望能够在不需要设置
xmlString
变量的情况下初始化类,那么您仍然可以执行相同的操作。将Trips class
init()
方法更改为所需的任何值,并将其设置为var xmlString = ""
或使其成为可选值:var xmlString: String?
。在需要初始化的地方初始化类,然后在完成
getXMLForTrips
时,执行trip.xmlString = xmlData
。