Swift: Как я могу реализовать проверку ответов API наиболее элегантным способом? - PullRequest
0 голосов
/ 22 февраля 2019

Я использую мойю для вызовов API в моем проекте.У меня есть BaseViewController.В этом контроллере я написал несколько общих методов для использования каждым viewcontroller.

BaseViewController имеет модель представления с именем BaseViewModel.

Все модели представления являются производными от BaseViewModel.

Я хочу вызвать функциюс параметром statusCode, когда все мои apis закончены.А затем в baseviewcontroller, я хочу получить код состояния, который я передал функции.Я объявил функцию как свойство, но я не знаю, как ее использовать.

Вот код.

    class BaseViewModel {

    var onApiFetchCompleted: (Int)?
    var isLoading = false {
        didSet{
            self.uploadLoadingStatus?()
        }
    }
    var uploadLoadingStatus : (() -> (Void))?
}

    class DataViewModel: BaseViewModel {
        func get(_ params: [String], completion: @escaping (Response) -> ()){
            var response = Response()!
            ApiProvider.request(.request(params: params)) { result in
            switch result {
            case let .success(moyaResponse):
                if moyaResponse.statusCode == 200 {
                    let json = try! moyaResponse.mapJSON() as! [String:Any]
                    response = Mapper<Response>().map(JSON: json)!
                }
                response.statusCode = moyaResponse.statusCode
                super.onApiFetchCompleted(response.statusCode)
            case let .failure(error):
                print("")
            }
            completion(response)
        }
    }
}
    class BaseVC: UIViewController {

    lazy private var viewModel: BaseViewModel = {
        return BaseViewModel()
    }()
    typealias onConfirmAccepted = ()  -> Void
    typealias onConfirmDismissed = ()  -> Void
    override func viewDidLoad() {
        super.viewDidLoad()

        viewModel.onApiFetchCompleted = {
        //here i want to use passed statusCode parameter to function
        if statusCode != 200 {
        if statusCode == 403 {
            returnToLogin(title: "Information", message: "Session Expired!")
        }
        else if statusCode == 401 {
            self.showError(title: "Unauthorized Access", message: "You have not permission to access this data!")
        }
        else {
            self.showError(title: "Error", message: "Unexpected Error. Call your system admin.")
        }
    }
        }

    }
}

1 Ответ

0 голосов
/ 22 февраля 2019

Я нашел решение:

В BaseViewModel я объявил функцию:

var onApiFetchCompleted: ((_ statusCode: Int) -> ())?

И в baseViewController:

 func onApiFetchCompleted(statusCode: Int)  {
    //do what you want with status code 
 }
override func viewDidLoad() {
    super.viewDidLoad()

    viewModel.onApiFetchCompleted = { (statusCode:Int) -> () in
        self.onApiFetchCompleted(statusCode: statusCode)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...