Я создаю приложение для iOS, и я только что закончил свою часть входа/регистрации (запрашивая API для отдыха Sais.js). На данный момент у меня есть 2 контроллера представления с дублирующимся кодом, потому что я выдаю остальные вызовы на прослушивателе событий кнопки регистрации/входа каждого class и есть много подобного кода, который я могу реорганизовать.
Что я хочу сделать, так это создать синглтон с именем ApiManager, который будет содержать все вызовы, которые мне нужны. (И будущие)
Проблема в том, что с асинхронными вызовами я не могу создать функцию входа в систему (имя пользователя, пароль), которая будет возвращать данные, чтобы я мог их сохранить и подготовиться.
Каков простой/правильный способ добиться этого правильно? Это означает вызов ApiManager.myFunction и использование результата везде, где это необходимо (заполнение табличного представления для данных, инициирование перехода для входа в систему или регистрация с успехом), а также возможность повторного использования этой функции в другом контроллере представления, даже если она предназначена для другого использования. Я использую свифт.
EDIT: Вот как я это сделал, надеюсь, это поможет вам
Функция, выполняющая оставшийся вызов:
func login(#username: String, password: String, resultCallback: (finalresult: UserModel!,finalerror:String!) -> Void) {
Alamofire.request(.POST, AppConfiguration.ApiConfiguration.apiDomain+"/login", parameters: ["username": username,"password": password], encoding: .JSON)
.responseJSON { request, response, data, error in
if let anError = error
{
resultCallback(finalresult: nil,finalerror:anError.localizedDescription)
}else if(response!.statusCode == 200){
var user:UserModel = self.unserializeAuth(data!)//just processing the json using SwiftyJSON to get a easy to use object.
resultCallback(finalresult: user,finalerror:nil)
}else{
resultCallback(finalresult: nil,finalerror:"Username/Password incorrect!")
}
}.responseString{ (request, response, stringResponse, error) in
// print response as string for debugging, testing, etc.
println(stringResponse)
}
}
И вот как я вызываю эту функцию из моего ViewController:
@IBAction func onLoginTapped(sender: AnyObject) {//When my user tap the login button
let username = loginInput.text;//taking the content of inputs
let password = passwordInput.text;
ApiManager.sharedInstance.login(username:username,password:password){
[unowned self] finalresult,finalerror in
if(finalresult !== nil){//if result is not null login is successful and we can now store the user in the singleton
ApiManager.sharedInstance.current_user=finalresult
self.performSegueWithIdentifier("showAfterLogin", sender: nil)//enter the actual app and leave the login process
}else{
self.displayAlert("Error!", message: finalerror)//it is basically launching a popup to the user telling him why it didnt work
}
}
}