IOS开发: 在Swift中使用AFNetworking

[复制链接]
查看: 30|回复: 1
  • TA的每日心情
    慵懒
    2018-4-28 09:37
  • 1459

    主题

    1485

    帖子

    11万

    积分

    管理员

    小语

    Rank: 9Rank: 9Rank: 9

    积分
    110351
    发表于 2018-4-2 10:56:21 | 显示全部楼层 |阅读模式

    今天主要简单说一下如何在Swift工程中使用时下比较流行的AFNetworking请求框架。

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

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


    wKiom1Xeb6zQJsmSAAAGEf2OHCc930.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。

    • 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 dicictionary= ["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来写一个简单的糗百或者新闻了,还等什么那,只要自己往前冲,就不会再最后。


    该用户从未签到

    0

    主题

    19

    帖子

    146

    积分

    注册会员

    Rank: 2

    积分
    146
    QQ
    发表于 2018-5-8 19:21:49 | 显示全部楼层
    正需要,支持楼主大人了!
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    在线客服
    热线电话

    微信公众账号
    返回顶部 关注微信 下载APP 返回列表