ViewController外部的数据任务

时间:2018-12-13 19:53:15

标签: swift urlsession

我将从当前正在学习Swift + iOS入手,所以我绝不是一个经验丰富的开发人员,也不是这个问题的开发人员。

我的目标是将当前在视图控制器中进行的所有网络调用分离到其外部的专用类中。

在此视图控制器中,我有一个IBAction,其中包含以下代码:

let config = URLSessionConfiguration.default
let session = URLSession(configuration: config)

session.dataTask(with: loginRequest) {
    (data, response, error) in
    guard let _ = response, let data = data else {return}

    do {
        let apiData = try NetworkManager.shared.decoder.decode(ApiData.self, from: data)
        let token = apiData.data?.token
        let saveToken: Bool = KeychainWrapper.standard.set(token!, forKey: "token")
        DispatchQueue.main.async {
            self.showOrHideActivityIndicator(showOrHide: false)
            self.showHomeScreen()
        }
    } catch let decodeError as NSError {
        print("Decoder error: \(decodeError.localizedDescription)\n")
        return
    }
}.resume()

我想要或想要实现的目标是这样的:

let apiData = "somehow get it from outside"

然后,当apiData中存储了信息时,执行下面的代码:

let token = apiData.data?.token
let saveToken: Bool = KeychainWrapper.standard.set(token!, forKey: "token")
DispatchQueue.main.async {
    self.showOrHideActivityIndicator(showOrHide: false)
    self.showHomeScreen()
}

我将如何实现?谢谢。

1 个答案:

答案 0 :(得分:0)

您可以尝试

class API {

  static func userLoginWith(email:String,password:String,completion:@escaping(_ token:String?) -> ()) {

        let config = URLSessionConfiguration.default
        let session = URLSession(configuration: config)

        session.dataTask(with: loginRequest) {
            (data, response, error) in
            guard let _ = response, let data = data else { completion(nil) ; return }

            do {
                let apiData = try NetworkManager.shared.decoder.decode(ApiData.self, from: data)
                completion(apiData.data?.token) 
            } catch {
                print("Decoder error: ",error")
                completion(nil)
            }
        }.resume()
  }        

}

在VC内部

API.userLoginWith(email:<##>,password:<##>) { (token) in  

    if let token = token { 
      let saveToken: Bool = KeychainWrapper.standard.set(token!, forKey: "token")
      DispatchQueue.main.async {
        self.showOrHideActivityIndicator(showOrHide: false)
        self.showHomeScreen()
     } 
   } 
}