我在应用程序中使用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)

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

最佳答案

我要说的常规方法是让调用此网络请求的任何人负责显示警报。如果请求完成后,您将回调原始调用对象,则它们将负责显示警报。原因之一是错误在不同的上下文中可能意味着不同的事物。您可能并不总是希望显示警报-在构建应用程序时,这为您提供了更大的灵活性。与AlamoFire完成后调用响应关闭的方式相同,我认为最好将其传递回Downloader对象中发起此调用的人。

更新:
您希望以与AlamoFire相同的方式来构造它。您将闭包传递给AF,当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")
        }
    }

  }
}

关于ios - 显示来自非UI类的警报,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27089714/

10-14 16:51
查看更多