【问题标题】:Swift Alamofire quit when request timed out请求超时时 Swift Alamofire 退出
【发布时间】:2016-04-12 11:26:43
【问题描述】:

我想知道如何在请求超时时退出我的函数。 如果我将服务器离线并尝试使用此功能进行一些调用,则应用程序将因以下原因而崩溃: 致命错误:在展开可选值时意外发现 nil

我的 Alamofire v3.x 函数如下所示:

static func loginWithFb(facebookId: String, email: String, username: String, response: (token: String?, errorVal: JSON?) -> ()) {
        let urlString = baseURL + ResourcePath.FbLogin.description

        let parameters: [String: AnyObject] = [
            "facebook_id": facebookId,
            "user_type": 1,
            "email": email,
            "username": username
        ]
        Alamofire.request(.POST, urlString, parameters: parameters).responseJSON{ (responseData) -> Void in

            let json = JSON(responseData.result.value!)

            let token = json["api_key"].string
            response(token: token, errorVal: json)
        }

    }

我得到 nil 来自: let json = JSON(responseData.result.value!)

和错误:

FAILURE: Error Domain=NSURLErrorDomain Code=-1001 "The request timed out." UserInfo={NSUnderlyingError=0x7fc39349c4a0 {Error Domain=kCFErrorDomainCFNetwork Code=-1001 "(null)" UserInfo={_kCFStreamErrorCodeKey=-2102, _kCFStreamErrorDomainKey=4}}, NSErrorFailingURLStringKey=http://mysite.dev/fb, NSErrorFailingURLKey=http://mysite.dev/fb,
_kCFStreamErrorDomainKey=4, _kCFStreamErrorCodeKey=-2102, NSLocalizedDescription=The request timed out.}
fatal error: unexpectedly found nil while unwrapping an Optional value

如果请求超时,我该如何退出通话?阻止它尝试获取 json 数据

谢谢,

【问题讨论】:

    标签: ios swift alamofire


    【解决方案1】:

    如果您的服务时间过长,您可以增加超时间隔。

    let request = NSMutableURLRequest(URL: NSURL.init(string: "your url")!)
    request.HTTPMethod = "GET"
    request.timeoutInterval = 250 // Set your timeout interval here.
    
    Alamofire.request(request).responseJSON { (responseData) -> Void in
        if((responseData.result.value) != nil) { //Check for response
            print(responseData.result.value!)
        }
    }
    

    并且必须检查响应不为零以解决致命错误问题。

    【讨论】:

    • 你如何传递参数和标题?
    • 我也想发送参数但不知道如何
    【解决方案2】:

    您需要了解更多关于 swift 变量展开的信息,只需一个简单的if(myJsonData != nil) 即可防止应用程序崩溃,您还可以添加一个警告框以防服务器上没有数据或服务器关闭等...

    static func loginWithFb(facebookId: String, email: String, username: String, response: (token: String?, errorVal: JSON?) -> ()) {
                let urlString = baseURL + ResourcePath.FbLogin.description
    
                let parameters: [String: AnyObject] = [
                    "facebook_id": facebookId,
                    "user_type": 1,
                    "email": email,
                    "username": username
                ]
                Alamofire.request(.POST, urlString, parameters: parameters).responseJSON{ (responseData) -> Void in
    
                    let myJsonData = JSON(responseData.result.value!)
    
                    if(myJsonData != nil)
                    {
                        let token = myJsonData["api_key"].string
                    }
                    else
                    {
                        // show alert box
                    }
                }
    
            }
    

    【讨论】:

      【解决方案3】:

      你的问题在这里

              let json = JSON(responseData.result.value!)
      

      您正在强制解开 value!,而不是将其包装在 if let

       if let json = JSON(responseData.result.value) as? NSDictionary {
                  let token = json["api_key"].string
                  response(token: token, errorVal: json)
       }
      

      超时很好,不会以任何方式影响您的应用。

      【讨论】:

      • 谢谢,但我试图把它放在一个 if 中,但我得到:“可选类型 'AnyObject' 的值未解包;你的意思是使用'!'或“?”
      • 我已经编辑过了,你还没有发布 JSON 方法,所以我猜它返回一个 NSDictionary
      猜你喜欢
      • 1970-01-01
      • 2018-12-14
      • 2019-08-13
      • 2017-11-15
      • 2015-01-23
      • 1970-01-01
      • 2019-09-08
      • 2016-02-25
      • 2018-12-12
      相关资源
      最近更新 更多