Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/120.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 显示来自非UI类的警报_Ios_Swift_Uialertview_Alamofire - Fatal编程技术网

Ios 显示来自非UI类的警报

Ios 显示来自非UI类的警报,ios,swift,uialertview,alamofire,Ios,Swift,Uialertview,Alamofire,我正在应用程序中使用Alamofire,如果请求有错误(例如错误的URL),我希望显示一个警报 我在一个单独的类中有这个函数,因为它在应用程序的页面之间共享 Alamofire.request(.GET, api_url) .authenticate(user: str_api_username, password: str_api_password) .validate(statusCode: 200..<300) .respons

我正在应用程序中使用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在完成时调用响应闭包的方式相同,我认为最好将其传递给在
下载程序中发起此调用的人

更新: 您希望以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")
        }
    }

  }
}
类下载程序{
func下载mystuff(完成:(AnyObject?、NSError?->Void){
请求(.GET,“http://myapi.com")
.验证(用户:“johndoe”,密码:“password”)
.验证(状态代码:200..Void in
如果let error=maybeError{
println(“在此处显示来自错误\(error)”的警报)
}
如果let result:AnyObject=maybresult{
println(“解析结果并做一些很酷的事情”)
}
}
}
}

谢谢你的回复John!但是我怎么做…?由于Alamofire请求是异步运行的,如果我试图将错误发送回类,我会调用该函数,直到它完全完成,我什么都没有得到,所以对我和我的SWIFT知识来说,这有点棘手…你能让它工作吗?我也有同样的问题问题…您如何处理应用程序的错误?
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")
        }
    }

  }
}