Проблема со страницей регистрации с использованием чистой быстрой архитектуры в XCode - PullRequest
0 голосов
/ 04 февраля 2019

В настоящее время я реализую функцию регистрации в приложении чата, над которым я работаю.В моем 'RegistrationViewController' я хочу реализовать функцию с именем 'signupButtonPressed', которая направляет меня от контролера представления регистрации к контроллеру просмотра ListContacts.Если регистрация завершится неудачно, будет выполнена функция с именем 'showValidationError'.Ниже приведен отрывок кода из моего RegistrationViewController:

@IBAction func signupButtonPressed(_ sender: Any) {
    let request = Signup.Request(
    name: fullNameTextField.text!,
    email: emailTextField.text!,
    password: passwordTextField.text!
    )

    interactor?.createAccount(request: request)   
}

func showValidationError(_ message: String) {
    let alertCtrl = UIAlertController(title: "Oops! An error occurred", message: message, preferredStyle: .alert)
    alertCtrl.addAction(UIAlertAction(title: "Ok", style: .cancel, handler: nil))
    self.show(alertCtrl, sender: self)
}

Я использую Swift Clean Architecture, поэтому я также свяжу код с моими файлами Registration Router, Model и Interactor:

1) Registrationinteractor.swift:

import Foundation

protocol SignupBusinessLogic {
    func createAccount(request: Signup.Request)
}

class SignupInteractor: SignupBusinessLogic {
    var viewController: SignupFormErrorLogic?
    var router: (NSObjectProtocol & SignupRoutingLogic)?
    var worker = UsersWorker()

    func createAccount(request: Signup.Request) -> Void {
        self.worker.signup(request: request) { user, error in

            guard error == nil else {

               print(error!)
                self.viewController?.showValidationError("Error creating account!")
                return
            }

            self.router?.routeToListContacts()
        }
    }
}

2) RegistrationModels.swift:

import Foundation

enum Signup {
    struct Request {
        var name: String
        var email: String
        var password: String
    }

    struct Response {
        var user: User?

        init(data: [String:Any]) {
            self.user = User(
                id: data["id"] as! Int,
                name: data["name"] as! String,
                email: data["email"] as! String,
                chatkit_id: data["chatkit_id"] as! String
            )
        }
    }
}

3) RegistrationRouter.swift:

import UIKit

@objc protocol SignupRoutingLogic {
    func routeToListContacts()
}

class SignupRouter: NSObject, SignupRoutingLogic {
    weak var viewController: SignupViewController?

    func routeToListContacts() {
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let destinationVC = storyboard.instantiateViewController(withIdentifier: "MainNavigator") as! UINavigationController

        viewController!.show(destinationVC, sender: nil)
    }
}

Функция регистрации в моем UsersWorker.swiftfile:

func signup(request: Signup.Request, completionHandler: @escaping (User?, UsersStoreError?) -> Void) {
    let params: Parameters = [
        "name": request.name,
        "email": request.email,
        "password": request.password
    ]

    postRequest("/api/users/signup", params: params, headers: nil) { data in
        guard data != nil else {
            return completionHandler(nil, UsersStoreError.CannotSignup)
        }

        let response = Signup.Response(data: data!)
        CurrentUserIDDataStore().setID(CurrentUserID(id: response.user?.chatkit_id))

        let request = Login.Account.Request(
            email: request.email,
            password: request.password
        )

        self.login(request: request) { token, error in
            guard error == nil else {
                return completionHandler(nil, UsersStoreError.CannotLogin)
            }

            DispatchQueue.main.async {
                completionHandler(response.user, nil)
            }
        }
    }
}

Когда я вписываю регистрационные данные в UITextfields регистрации (fullNameTextField; emailTextField; passwordTextField) и нажимаю кнопку регистрации, возникает ошибка CannotSignup.Не уверен почему однако.Этот случай также можно найти в моем файле UsersWorker.swift:

enum UsersStoreError: Error {
    case CannotLogin
    case CannotSignup
    case CannotFetchChatkitToken
}

Было бы замечательно, если бы кто-нибудь смог просмотреть код, чтобы понять, что может быть за проблема, и как я могу ее решить.Это?Если требуется дополнительная информация, просто спросите!

1 Ответ

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

Скорее всего, вызов API завершается неудачно. Пожалуйста, проверьте код возврата HTTP вместо data.В некоторых случаях вызов API может быть успешным без каких-либо данных ответа. В идеале отправьте также экземпляр Error вместе с данными из postRequest метода

...