1

我在我的应用程序中使用 Alamofire 并希望在请求有错误(例如错误的 URL)等时显示警报。

我在一个单独的类中有这个函数,因为它在应用程序的页面之间共享。

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

            if (error != nil) {
                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)
            }
    }

由于 Alamofire 异步工作,我需要在那时和那里进行错误检查(除非你另有建议),因为那时我想操纵结果,如果 URL 错误,那么它可能会变得混乱。

毫不奇怪,

self.presentViewController(alertController, animated: true, completion: nil)

不起作用,那么如何显示此警报?

4

1 回答 1

2

我想说的传统方法是让调用此网络请求的人负责显示警报。如果当请求完成时,你回调到原来的调用对象,它们负责显示警报。造成这种情况的原因之一是错误在不同的上下文中可能意味着不同的事情。您可能并不总是希望显示警报 - 这为您在构建应用程序时提供了更大的灵活性。就像 AlamoFire 在完成后调用您的响应关闭一样,我认为最好将其传回给在您的Downloader对象中发起此调用的人。

更新: 你想以与 AlamoFire 相同的方式来构建它。您将闭包传递给 AF,AF 请求完成时调用它。

您必须在下载函数中添加一个闭包参数(请参阅 参考资料downloadMyStuff)。然后,一旦 AF 请求完成,您就可以调用之前定义的闭包 ( completion)。这是一个简单的例子

class Downloader {
  func downloadMyStuff(completion: (AnyObject?, NSError?) -> Void) {

    Alamofire.request(.GET, "http://myapi.com")
        .authenticate(user: "johndoe", password: "password")
        .validate(statusCode: 200..<300)
        .response { (request, response, data, error) in
            completion(data, error)

      }
  }
}

class ViewController: UIViewController {

let downloader = Downloader()

override func viewDidLoad() {
    super.viewDidLoad()

    self.downloader.downloadMyStuff { (maybeResult, maybeError) -> Void in
        if let error = maybeError {
            println("Show your alert here from error \(error)")
        }

        if let result: AnyObject = maybeResult {
            println("Parse your result and do something cool")
        }
    }

  }
}
于 2014-11-23T14:08:02.683 回答