Alamofire的Swift完成处理程序似乎没有执行

时间:2016-11-30 02:43:13

标签: ios swift closures alamofire

我的程序中的类中有以下函数:

    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值而显示)。我认为没有理由不这样做。谁能看到我错过的东西?

1 个答案:

答案 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