如何在Swift 中使用AFNetworking

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

[[147119]]

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

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

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

 

 

 

好了,可以在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' 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

在使用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. 
// 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
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! 
         
   } 

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.

拿到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 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 失败了"

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.

在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") 
*/ 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

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

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

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

责任编辑:chenqingxiang 来源: XiaoyangWorld的专栏
相关推荐

2014-07-02 09:47:06

SwiftCocoaPods

2021-03-09 07:27:40

Kafka开源分布式

2022-06-23 08:00:53

PythonDateTime模块

2022-05-17 08:25:10

TypeScript接口前端

2021-06-09 09:36:18

DjangoElasticSearLinux

2011-08-10 09:31:41

Hibernateunion

2024-01-18 08:37:33

socketasyncio线程

2015-11-26 10:57:56

DockerOpen vSwitc

2023-12-01 09:18:27

AxiosAxios 库

2021-09-10 10:30:22

Java代码

2022-10-25 09:07:28

Linuxxargs命令

2024-09-06 11:34:15

RustAI语言

2019-09-16 19:00:48

Linux变量

2020-11-30 11:55:07

Docker命令Linux

2020-04-09 10:18:51

Bash循环Linux

2012-05-01 20:57:26

Sencha Touc

2020-06-30 12:00:12

AIOps人工智能IT运营

2021-01-12 07:34:13

NetCore 映射器对象

2020-09-09 07:00:00

TensorFlow神经网络人工智能

2019-09-04 19:32:56

HiveFlink大数据
点赞
收藏

51CTO技术栈公众号