当请求超时时,Swift Alamofire退出

时间:2016-04-12 11:26:44

标签: ios swift alamofire

我想知道当请求超时时我如何退出我的功能。 如果我让我的服务器脱机并尝试使用此功能进行一些调用,应用程序将崩溃,原因是: 致命错误:在展开“可选”值时意外发现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)
        }

    }

我从零开始: 的 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数据

谢谢,

3 个答案:

答案 0 :(得分:2)

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

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!)
    }
}

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

答案 1 :(得分:1)

您的问题在这里

        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)
 }

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

答案 2 :(得分:1)

您需要了解有关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
                }
            }

        }