首页 >Swift

如何在Swift 中使用AFNetworking

2015-08-27 09:09 编辑: suiling 分类:Swift 来源:XiaoyangWorld的专栏

u=500250691,3617306368&fm=15&gp=0.jpg

本文是投稿文章,作者:XiaoyangWorld(博客


苹果于2014年WWDC发布Swift全新语言,前不久2.0也正式发布,作为一个iOS开发人员,也一定要跟上节奏,因此最近在平时的闲暇时间,开始把自己做过的项目尝试用swift语言写了一遍,学习全新的语法和设计模式,由于学习Swift的时间比较短,今天主要简单说一下如何在Swift工程中使用时下比较流行的AFNetworking请求框架。

由于目前AFNetworking目前还没有Swift版本,因此我们的工程使用cocoapod来安装AFNetworking。

这是我的Prodfile文件,cocoapod的使用方法跟使用OC是时候是一模一样的,为了方便,我们在工程中随便创建一个类,选择语言OC,我们会发现工程中会多出来一个SwiftStudy-Bridging-Header.h文件,删除创建的oc类,在这里引入
011.png

好了,可以在swift文件使用AFNetworking

platform :ios, '7.0'
pod 'SDWebImage', '~> 3.7.1'
pod 'CocoaHTTPServer', '~> 2.3'
pod 'RoutingHTTPServer', '~> 1.0.0'
pod 'Masonry', '~> 0.6.1'
pod 'ASIHTTPRequest', '~> 1.8.2'
pod 'MBProgressHUD', '~> 0.9.1'
pod 'AFNetworking', '~> 2.5.4'

在使用OC进行项目开发时,对AFNetworking做了一层简单的外部封装,今天我们就把它用Swift实现。

使用过新版AFNetworking的都知道它有一个AFHTTPSessionManager,在这里我们继承AFHTTPSessionManager使用单例模式返回一个该类的实例,

来进行网络操作在swift中单例的写法跟OC语法差别很大,Swift语法在这里不多讲解,请参考《The Swift Programming Language》,我们来看下代码

//
//  RequestClient.swift
//  SwiftStudy
//
//  Created by 杨雯德 on 15/8/19.
//  Copyright (c) 2015年 杨雯德. All rights reserved.
//
import UIKit
class RequestClient: AFHTTPSessionManager {
   
   class var sharedInstance :RequestClient {
       struct Static {
           static var onceToken:dispatch_once_t = 0
           static var instance:RequestClient? = nil
       }
       
       dispatch_once(&Static.onceToken, { () -> Void in
         //string填写相应的baseUrl即可
           var url:NSURL = NSURL(string: "")!
           Static.instance = RequestClient(baseURL: url)
       }) 
         //返回本类的一个实例
       return Static.instance!
       
   }
}

拿到RequestClient的实例我们就可以进行post、get以及上传图片文件的封装了

在OC中使用AFNetworking习惯使用block来进行数据的传递等,在Swift我们使用闭包来进行数据的传输

这是我的文件目录

SwiftStudy ------------工程目录

  • AppDelegate.swift

  • myViewController.swift

  • ViewController.swift

NetWork  ------------网络相关

  • RequestClient.swift

  • RequestAPI.swift

CustomVC ------------VC的封装,

  •   CostomNavigationVC.swift

  •   BaseViewController.swift

在这里我们主要拿中国天气网的API测试一个PUT请求,来看下RequestAPI.swift。

typealias Succeed = (NSURLSessionDataTask!,AnyObject!)->Void
typealias Failure = (NSURLSessionDataTask!,NSError!)->Void
class RequestAPI: NSObject {
   
   //普通get网络请求
   class func GET(url:String!,body:AnyObject?,succeed:Succeed,failed:Failure) {
       var mysucceed:Succeed = succeed
       var myfailure:Failure = failed
       RequestClient.sharedInstance.GET(url, parameters: body, success: { (task:NSURLSessionDataTask!, responseObject:AnyObject!) -> Void in
           mysucceed(task,responseObject)
           
           }) { (task:NSURLSessionDataTask!, error:NSError!) -> Void in
               myfailure(task,error)
       }
 
}

Swift的一个好处是我们不用在无用的头文件引入,Objective-C中头文件的引入眼睛都看不下去了,

在OC中经常会用到typedef,用来为一种数据类型定义一个新名字,在Swift中用typealias来现有的类型定义可替代名称,

这里我们定义两个funcation,Succeed和Failure,Succeed有两个参数NSURLSessionDataTask和AnyObject返回为空,分别对应AFNetworking网络请求返回的NSURLSessionDataTask和id,id型数据

正是我们需要的数据,只不过在swift我们使用的是AnyObject,Failure同样如此,然后我们来看看class func GET,在定义方法时我们定义了一下几个参数:

1:url:String!  不解释  码农都懂的

2:body:AnyObject?  传递的postBody体,由于我们不确定开发人员get请求是否需要其他的参数,因此再次设置类型为AnyObject?,这样如果用户不需要直接传nil即可

3:succeed:Succeed  很熟悉有没有,这就是最开始我们定义的funcation,返回数据就靠它的了

4:failed:Failure  看到failed真爱有某有,里面有我们最喜欢的NSError,简直见一次想打一次

接下来看函数内部实现,我们定义两个变量来接收传递过来的函数指针,通过函数指针就可以回传数据拉。Swift与Objective-C最大的不同是使用了.语法,继续往下看

通过RequestClient.sharedInstance 我们可以获得RequestClient的一个实例,这就是swift中单例模式的使用哦,回来在看看RequestClient.swift就明白了,

然后我们就开始真正的网络请求了,调用AFHTTPSessionManager的PUT方法

RequestClient.sharedInstance.GET(url, parameters: body, success: { (task:NSURLSessionDataTask!, responseObject:AnyObject!) in
           mysucceed(task,responseObject)
           
           }) { (task:NSURLSessionDataTask!, error:NSError!) in
               myfailure(task,error)
       }

依次填写对应的参数,我们看下

success: { (task:NSURLSessionDataTask!, responseObject:AnyObject!) -> Void in
           mysucceed(task,responseObject)
           
           })

这是一个标准的闭包, (task:NSURLSessionDataTask!, responseObject:AnyObject!) -> Void有没有感觉很熟悉,正是我们最开始定义的Succeed,由此,你又学习

了一招闭包的表达式写法

{ (parameters) -> returnType in
statements
}

关于闭包的具体操作请查看 “http://c.biancheng.net/cpp/html/2285.html

闭包函数中我们就可以拿到服务器给我们返回的数据了responseObject,在函数开始我们已经接受了外部的函数指针,通过这个函数指针我们把值传递回去即可,

我们来看下我测试类中得代码

override func viewDidLoad() {
        super.viewDidLoad()
        
        self.view.backgroundColor = UIColor.brownColor()
        var image:UIImage
        //Navigationbar 左侧返回按钮自定义,参考文件BaseViewController.swift
        self.leftButton(nil, hlIimage: nil, title: "返回", size: CGSize(width: 38, height: 30), action: "buttonClick", target: self)
        
        var dic:Dictionary= ["A":"a","B":"b","C":"c"];
        
        
        //post测试
        RequestAPI.POST("List", body: dic, succeed: succeed, failed:failed)
        //get测试
        var getUrl:String = "http://m.weather.com.cn/atad/101190101.html"
        RequestAPI.GET(getUrl, body: nil, succeed: succeed, failed: failed)
        
        //文件上传
        // Do any additional setup after loading the view.
    }
    func succeed(task:NSURLSessionDataTask!,responseObject:AnyObject!)->Void{
        println("oh my god  成功了+\(responseObject)")
    }
    
    func failed(task:NSURLSessionDataTask!,error:NSError!)->Void{
        println("oh shit 失败了")
    }

在ViewController我们通过调用RequestAPI的类方法GET来获取数据,同时我们定义了两个方法succeed和failed,注意看方法中得参数和AFHTTPSessionManager

返回数据的参数是一样的,这样我们的拿到的数据就是服务器给我们返回的全部数据,调用equestAPI的GET方法将讲个函数指针传递过去,网络请求成功之后会通过函数指针将数据返回。

然后我们就可以进行其他的工作了。

使用过新版AFNetworking会经常遇到3084 1011和1016错误,出现这几个错误一般是数据解析错误,更改AFNetworking里面相应的数据类型即可,也可以根据实际情况自己定义。

/**
RequestClient.sharedInstance.requestSerializer = AFJSONRequestSerializer()
RequestClient.sharedInstance.responseSerializer = AFJSONResponseSerializer()
RequestClient.sharedInstance.requestSerializer.setValue("application/json,text/html", forHTTPHeaderField: "Accept")
RequestClient.sharedInstance.requestSerializer.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type")
*/

总结,AFNetworking已经是用的最多的网络的框架,对AFNetworking的进一步的简单外层封装,我们就可以避免网络请求时大量初始化工作,直接使用单例即可,这样提高了

效率,也节省了大量的代码,至少一眼望去自己看的也比较舒服,通过使用Swift来封装AFNetworking,也系统的熟悉一下swift的基本语法,数据类型,以及单例,闭包等得使用,

对应swift初学者来说,实际学习效果还是比较明显的,有了这些现在你就可以使用swift来写一个简单的糗百或者新闻了,还等什么那,只要自己往前冲,就不会再最后。

Demo地址 https://github.com/Winter-Yang/SwiftStudy

搜索CocoaChina微信公众号:CocoaChina
微信扫一扫
订阅每日移动开发及APP推广热点资讯
公众号:
CocoaChina
我要投稿   收藏文章
上一篇:读懂Swift 2.0中字符串设计思路的改变
下一篇:如何用Swift实现一个好玩的弹性动画
我来说两句
发表评论
您还没有登录!请登录注册
所有评论(0

综合评论

相关帖子

sina weixin mail 回到顶部