显示来自非 UI 类的警报

Posted

技术标签:

【中文标题】显示来自非 UI 类的警报【英文标题】:Display alert from a non-UI class 【发布时间】: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)

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

【问题讨论】:

你能做到吗?我也遇到了同样的问题...您如何处理应用程序的错误? 【参考方案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 的了解有点棘手......跨度>

以上是关于显示来自非 UI 类的警报的主要内容,如果未能解决你的问题,请参考以下文章

显示来自 viewDidLoad 的警报消息

依次显示两个相同的警报视图。如何区分来自警报 1 和警报 2 的文本?

如何在 swift ui 中显示两个警报,一个接着一个

如何显示来自不同班级的警报

使用 ui-bootstrap 显示在右上角的警报,使用 Angularjs 进行引导

在swift 3中显示来自自定义单元格的警报