2014-11-23 5 views
1

Я проделал некоторое чтение, и была рекомендация в аналогичном сообщении (Swift closure with Alamofire) и попыталась сделать то же самое с моим кодом, но я не могу найти способ вызова функции сейчас?Быстрое завершение функции

я получаю ошибку: Не удается преобразовать тип Выражение в '(ответ: @lvalue String)' к типу '((ответ: String) ->()) ->()'

import UIKit 

class myClass101: UIViewController { 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view. 
    var api_error: String = "" 

    activityInd.startAnimating() 

    call_api_function(response: api_error) 

    activityInd.stopAnimating() 

    if (api_error != "") { 
     let alertController = UIAlertController(title: "Server Alert", message: "Could not connect to API!", preferredStyle: UIAlertControllerStyle.Alert) 
     alertController.addAction(UIAlertAction(title: "Dismiss", style: UIAlertActionStyle.Default,handler: nil)) 
     self.presentViewController(alertController, animated: true, completion: nil) 
    } 
    } 
} 

функция такова:

func call_api_function(completion: (response: String) ->()) { 

    let api_url_path: String = "http://\(str_api_server_ip):\(str_api_server_port)" 
    let api_url = NSURL(string: api_url_path + "/devices.xml")! 

    Alamofire.request(.GET, api_url) 
     .authenticate(user: str_api_username, password: str_api_password) 
     .validate(statusCode: 200..<300) 
     .response { (request, response, data, error) in 

      var senderror: String = error!.localizedDescription 
      completion(response: senderror) 

      if (error != nil) { 

       println(senderror) 
      } 

      // do other tasks here 

    } 

} 

Спасибо!

Костас

ответ

2

Учитывая ваше определение call_api_function, вы могли бы назвать его следующим образом:

call_api_function() { response in 

    activityInd.stopAnimating() 

    // now use `response` here 
} 

Я предлагаю вам сделать небольшое исследование на заднем закрытие в The Swift Programming Language: Closures.


Но, сказав, что ваш call_api_function имеет свои собственные проблемы.

  • Вы делаете принудительное разматывание error опционально. Что, если ошибки не было? Затем принудительная разворачивание необязательной опции nil завершится с ошибкой, и код сработает.

  • Если запрос выполнен успешно, вы ничего не делаете с возвращенным data. Предположительно, вы выполнили запрос, потому что вы хотели что-то сделать с возвращенными данными.

    К сожалению, вы не предоставляют информацию о характере ответа XML вы ожидали, но по-видимому вы бы создать экземпляр NSXMLParser экземпляр для синтаксического анализа, а затем реализовать в NSXMLParserDelegate методы и вызова метода parse.

  • Следуя за предыдущими точками, а не замыканием с одним необязательным параметром, я ожидаю увидеть замыкание с двумя необязательными параметрами, необязательно с проанализированными данными (которые будут установлены, если запрос и синтаксический анализ были успешными) и необязательный с NSError (который будет установлен только в случае возникновения ошибки).

  • Очень незначительная точка, но вы можете принять соглашения об именах какао (например, соглашение camelCase от callApiFunction).

+0

Большое спасибо за ваш вклад. Роб! Очень признателен!!!! – Kostas

+0

Кстати, [ответ на ваш другой вопрос] (http://stackoverflow.com/a/27089820/1271826) показывает пример закрытия с двумя параметрами. Ясно, что, учитывая, что вы имеете дело с XML, вы также можете проанализировать его, но этот другой ответ иллюстрирует идею передачи двух параметров через закрытие. – Rob