Swift2网络操作和异常处理
相信写过Swift的人应该都知道Alamofire,它是AFNetworking的Swift版本,同一个作者写的。之前在项目中我也一直使用Alamofire,但是升级到Xcode7之后旧版的Alamofire不能用了,最新版的又只支持iOS8之后的系统,而公司项目还得兼容iOS7,所以接下来不打算用它了。 我的需求比较简单,只要能发送GET请求获取数据以及发送POST请求提交数据就好了,大致看了一下Alamofire的源码又上网查了点资料之后,花了不到半天写了几个简单的函数,项目又能正常跑起来了。 iOS7之后的系统都支持 funcgetDataFrom(urlString:String,method:HTTPMethod,parameter:[String:String]?,completionHandler:Callback)throws{//letconfig=NSURLSessionConfiguration.defaultSessionConfiguration() //config.timeoutIntervalForRequest=20 //letsession=NSURLSession(configuration:config) guardleturl=NSURL(string:urlString)else{ throwError.InvalidURL }letsession=NSURLSession.sharedSession()letrequest=NSMutableURLRequest(URL:url) request.HTTPMethod=method.rawValueswitchmethod{case.POST://如果参数为nil或者字典中没有元素,则抛出异常 guardletparam=parameterelse{ throwError.NoParameter } guardparam.isEmptyelse{ throwError.NoParameter } request.addValue("application/json",forHTTPHeaderField:"Content-Type") request.addValue("application/json",forHTTPHeaderField:"Accept")do{ request.HTTPBody=tryNSJSONSerialization.dataWithJSONObject(param,options:[]) }catch{print(error) }case.GET:break }lettask=session.dataTaskWithRequest(request){data,response,errorin guardletresult=datawhereerror==nilelse{ printLog("nodata:(error)")return } completionHandler(data:result) }//启动 task.resume() } 这个函数声明的时候在 ha~.jpg 我对异常处理的理解很浅薄,说实话平常自己也不怎么喜欢用。在我看来异常处理最重要的用途有两点:
像我上面那个函数,如果纯粹是自己用的话,其实我会选择在出错的地方直接处理错误或者打印错误信息,譬如把 printLog("InvalidURL")return 这样也省得调用函数的时候一堆 上面那个函数还可以封装一下,分成两个,一个用来发送 funcgetJsonFrom(url:String,completion:(json:JSON)->Void){do{trygetDataFrom(url,method:HTTPMethod.GET,parameter:nil){datain letjson=JSON(data:data)//主线程进行UI操作 dispatch_sync(dispatch_get_main_queue()){ completion(json:json) } } }catchError.InvalidURL{ printLog("GET:invalidurl") }catch{ printLog("Unknownerror") } } funcpostJson(dict:[String:String],toUrlurl:String,method:HTTPMethod.POST,parameter:dict){datain letjson=JSON(data:data)//主线程进行UI操作 dispatch_sync(dispatch_get_main_queue()){ completion(json:json) } } }catchError.InvalidURL{ printLog("POST:invalidurl") }catchError.NoParameter{ printLog("Parameterisempty") }catch{ printLog("Unknownerror") } } 完整代码在这里,里面还有一个图片缓存的函数,有兴趣的话可以看看。如果跟我有同样需求的同学可以把 对了还有一点,我一开始用 publicinit(data:NSData,optionsopt:NSJSONReadingOptions=.AllowFragments,error:NSErrorPointer=nil){do{letobject:AnyObject=tryNSJSONSerialization.JSONObjectWithData(data,options:opt) self.init(object) }catchletaErrorasNSError{iferror!=nil{ error.memory=aError } self.init(NSNull()) } }publicinit(_object:AnyObject){ self.object=object}
三种我都试了,都不行,最后我试了下 publicinit(data:NSData,optionsopt:NSJSONReadingOptions=[],error:NSErrorPointer=nil){//其余不变 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |