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