首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >ViewController外部的数据任务

ViewController外部的数据任务
EN

Stack Overflow用户
提问于 2018-12-14 03:53:15
回答 1查看 50关注 0票数 1

首先,我现在正在学习swift + iOS,所以我不是一个有经验的开发者,也不是一个有经验的开发者。

我的目标是将当前在我的视图控制器中完成的任何网络调用分离到它外部的一个专用类。

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

代码语言:javascript
复制
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中存储了信息时,执行下面这段代码:

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

我将如何实现这一点?谢谢。

EN

回答 1

Stack Overflow用户

发布于 2018-12-14 04:03:37

你可以试试

代码语言:javascript
复制
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内部

代码语言:javascript
复制
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()
     } 
   } 
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53769160

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档