【问题标题】:Display alert from a non-UI class显示来自非 UI 类的警报
【发布时间】:2014-11-23 13:56:56
【问题描述】:

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

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

【问题讨论】:

  • 你能做到吗?我也遇到了同样的问题...您如何处理应用程序的错误?

标签: ios swift uialertview alamofire


【解决方案1】:

我想说的是,传统的方法是让调用此网络请求的人负责显示警报。如果当请求完成时,你回调到原来的调用对象,它们负责显示警报。造成这种情况的原因之一是错误在不同的上下文中可能意味着不同的事情。您可能并不总是希望显示警报 - 这为您在构建应用程序时提供了更大的灵活性。与 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")
        }
    }

  }
}

【讨论】:

  • 感谢您的回复,约翰!不过,我怎么能这样做……?由于 Alamofire 请求是异步运行的,如果我尝试将错误发送回我调用该函数的类,在它完全完成之前我什么也得不到,所以这对我和我对 SWIFT 的了解有点棘手......跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多