【问题标题】:How can i separate my networking code from my ViewController如何将我的网络代码与我的 ViewController 分开
【发布时间】:2019-01-04 08:08:38
【问题描述】:

我目前正在使用Alamofire 发出帖子请求。我首先在ViewController 中构建它并工作。但后来我试图通过在另一个class 中构建它来分离它。我使用singleton 并且当我拨打ViewController 时仍然有效。唯一的问题是在状态恢复成功后,我试图在用户登录时实例化另一个ViewController。我不想在网络类中执行此操作,我想在我的 ViewController 中执行此操作。我怎样才能做到这一点?

enum Status: Int {
    case Success = 200
    case Failure = 401
}

enum HTTPMethod: String {
    case Post = "POST"
    case Get = "GET" 
}

enum APIKey: String {
    case value = "somevalueeeeeeeee"
    case key = "somekeyyyyyyyyyyyyyy"
}

import Foundation
import Alamofire
import UIKit

class NetworkManager {
    static let shared = NetworkManager()

    func makePostRequest(url: URL, params: Parameters, headers: HTTPHeaders, credential: URLCredential) {
        Alamofire.request(url, method: .post, parameters: params, headers: headers).authenticate(usingCredential: credential)
            .responseJSON { response in
                print(response)
                let status = response.response?.statusCode
                switch status {
                case Status.Success.rawValue:
                    print("I would like to instantiate my viewcontroller here")
                case Status.Failure.rawValue:
                    print("Bad Request")
                default:
                    break
                }
        }
    }
}

import UIKit
import Alamofire

class LoginViewController: UIViewController {
    @IBOutlet weak var emailTextField: UITextField!
    @IBOutlet weak var passwordTextfield: UITextField!

    private func login() {
        guard let userName = emailTextField.text else { return }
        guard let passWord = passwordTextfield.text else { return }

        let params: Parameters = [
            "username": userName,
            "password": passWord
        ]
        guard let url = URL(string: URLS.url.rawValue) else { return }
        let headers = [APIKey.key.rawValue: APIKey.value.rawValue]
        let credential = URLCredential(user: userName, password: passWord, persistence: .forSession)

        NetworkManager.shared.makePostRequest(url: url, params: params, headers: headers, credential: credential)
    }

    @IBAction func onLoginTapped(_ sender: UIButton) {
            login()
        }
    }

【问题讨论】:

    标签: ios swift networking alamofire


    【解决方案1】:

    您可以将完成处理程序从网络管理器类传递给您的控制器。

     func makePostRequest(url: URL, params: Parameters, headers: HTTPHeaders, credential: URLCredential, completion:@escaping (Result<Any>)->()) {
            Alamofire.request(url, method: .post, parameters: params, headers: headers).authenticate(usingCredential: credential)
                .responseJSON { response in
                    print(response)
                    completion(response.result)
                    let status = response.response?.statusCode
                    switch status {
                    case Status.Success.rawValue:
                        print("I would like to instantiate my viewcontroller here")
                         completion(response.result)
                        break
                    case Status.Failure.rawValue:
                        print("Bad Request")
                         completion(response.result)
                        break
                    default:
                        break
                    }
            }
        }
    

    现在你可以像下面这样调用这个函数

      NetworkManager.shared.makePostRequest(url: url, params: , headers: param, credential: credential, completion: { (response) in
             if result.isSuccess, let json = result.value {
                // Use json variable to handle json
            } else {
                self.showAlert(R.string.keys.somethingWentWrong())
            }
       })
    

    【讨论】:

    • 我试过了,但目前没有运气,我该怎么做。加上我会给出什么论据?
    • 这也有效。在发出Get 请求时将使用它。干杯
    【解决方案2】:

    为你的函数添加完成块:

    func makePostRequest(url: URL, params: Parameters, headers: HTTPHeaders, credential: URLCredential, completion:@escaping(Bool)->()) {
        Alamofire.request(url, method: .post, parameters: params, headers: headers).authenticate(usingCredential: credential)
            .responseJSON { response in
                print(response)
                let status = response.response?.statusCode
                switch status {
                case Status.Success.rawValue:
                    print("I would like to instantiate my viewcontroller here")
                    completion(true)
                    break
                case Status.Failure.rawValue:
                    print("Bad Request")
                    completion(false)
                    break
                default:
                    break
                }
        }
    }
    

    从 ViewController 中这样调用它:

    NetworkManager.shared.makePostRequest(url: URL, params: Parameters, headers: HTTPHeaders, credential: "") { (success) in
        if success {
    
        } else {
    
        }
    }
    

    【讨论】:

    • @user6574269 更新了答案。复制完成块的确切行。
    • 谢谢,就像一个魅力,不敢相信这花了我一整天,没想到使用布尔。干杯
    猜你喜欢
    • 2017-10-03
    • 1970-01-01
    • 1970-01-01
    • 2021-08-24
    • 2020-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-13
    相关资源
    最近更新 更多