2015-08-27 3 views
1

Я пытаюсь реализовать службу входа в систему для приложения, и я хотел бы исключить исключение, если код статуса ответа не равен 200. Я использую Alamofire как сетевая библиотека HTTP.Swift 2.0: исключение throw в асинхронном фрагменте кода

static func loginWithUsername(username: String, andPassword password: String) throws { 

    let action = "SmartShoppers/login" 
    let url = baseUrl + action 


    Alamofire.request(.POST, url, parameters: ["username": username, "password": password]) 
     .response { request, response, data, error in 
      if response?.statusCode != 200 { 
       throw ServiceError.LogInError 
      } 
    } 
} 

Это определение ServiceError перечисление:

enum ServiceError: ErrorType { 
    case LogInError 
} 

То, что я хочу сделать дело это исключение, когда выбрасывается в функцию, которая вызывается при нажатии кнопки. Эта функция находится в классе ViewController, связанном с ViewController, который содержит эту кнопку. Код, который будет выполняться в:

do { 
    try Service.loginWithUsername(username, andPassword: password) 
} catch { 
    // SHOW AN ALERT MESSAGE 
} 

Почему я получаю сообщение Cannot call value of non-function type 'NSHTTPURLResponse'? Это правильный способ реализовать эту услугу? Если нет, пожалуйста, помогите мне.

ответ

2

Закрытие, которое вы передаете методу response, не включает в свою подпись throws, поэтому вы не сможете исключить из него исключение.

IMO это не тот случай, когда вы хотите выбросить исключение, в любом случае - код ответа не-200 не является исключительной ошибкой/сбоем, и я бы не стал использовать исключение здесь как средство контроль потока.

+1

Как я могу включить 'throws' в подпись? Должен ли я вводить код Alamofire? – lmiguelvargasf

+0

, где вы начнете, да - например. если вы используете v1.3.1, вы найдете здесь определение функции 'response' -> https://github.com/Alamofire/Alamofire/blob/1.3.1/Source/ResponseSerialization.swift#L116 - но опять же, я не советовал бы идти по этому маршруту – fqdn

+0

Вы не можете бросить таким образом. Я бы посоветовал здесь @ fqdn. Если вы хотите точно понять, почему вы не можете бросить этот путь, я предлагаю вам попробовать работать с примером на игровой площадке, где вы создаете метод входа async с обработчиком завершения и пытаетесь сделать его асинхронным. Это не работает. Именно поэтому мы используем типы «Result» в Alamofire. – cnoon

Смежные вопросы