我的程序中的类中有以下函数:
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")
}
}
}
在类的init()中,我尝试这样调用它:
getXMLForTrips(atStop: stop, forRoute: route) { xmlData in
self.XMLString = xmlData
}
这个编译没有错误,但是在执行init()之后,我的类的self.XMLString仍然是nil(由Xcode调试器和我的程序崩溃,由于之后的nil值而显示)。我认为没有理由不这样做。谁能看到我错过的东西?
答案 0 :(得分:1)
您不应该在课程的初始化程序中进行互联网调用。在完成互联网调用之前,您将返回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类init()
方法更改为您需要的方法并设置var xmlString = ""
或将其设为可选:var xmlString: String?
。
在初始化所需的任何地方初始化该类,然后在完成getXMLForTrips
时,执行trip.xmlString = xmlData
。