网络

基础

NSURL *url = [NSURL URLWithString:@""];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
//设置请求方法
request.HTTPMethod = @"POST";//默认为GET方法
//设置请求体
NSString *name=@"123";
NSString *pwd=@"123";0.
NSString *par=[NSString stringWithFormat:@"username=%@&pwd=%@", name, pwd];

//转化成可用数据
NSData *data = [par dataUsingEncoding:NSUTF8StringEncoding];
//设置请求体
request.HTTPBody = data;

//设置请求头
[request setValue:@"iPhone 88客户端" forHTTPHeaderField:@"User-Agent"];

默认情况下不能传输中文数据,设置编码转换

str = [str stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

发送JSON给服务器

NSDictionary *orderInfo = @{
      @"shop_id":@"1234",
      @"shop_name":@"呜呜",
      @"user_id":@"xu", nil
};

NSData *json = [NSJSONSerialization dataWithJSONObject:orderInfo options:NSJSONWritingPrettyPrinted error:nil];

request.HTTPBody = json;

[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];

网络状态

Reachability *wifi = [Reachability reachabilityForLocalWiFi];
NetworkStatus wifiStatus = wifi.currentReachabilityStatus;
if (wifiStatus != NotReachable) {
        NSLog(@"WIFI连通");
}

随时监听

@interface ViewController ()
@property (nonatomic, strong) Reachability *reach;
@end
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChange) name:kReachabilityChangedNotification object:nil];

self.reach = [Reachability reachabilityForInternetConnection];
    
[self.reach startNotifier];
-(void)reachabilityChange
{
    NSLog(@"网络状态改变了");
}

大文件节省内存下载

NSFileManager *fileMgr = [NSFileManager defaultManager];

NSString *fileDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];

NSString *filePath = [fileDir stringByAppendingPathComponent:@"video.zip"];

[fileMgr createFileAtPath:filePath contents:nil attributes:nil];
//NSFileHandle *
self.writeHandle = [NSFileHandle fileHandleForWritingAtPath:filePath];

每次读取到数据

[self.writeHandle seekToEndOfFile];
[self.writeHandle writeData:data];

NSURLSession使用

NSURLSession *session = [NSURLSession sharedSession];
NSURL *url = [NSURL URLWithString:@"www.baidu.com"];
NSURLSessionDataTask *task = [session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        NSString *d = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
        NSLog(@"%@", d);
}];
    
[task resume];

进行文件下载(自动小内存下载)

NSURLSession *session = [NSURLSession sharedSession];
NSURL *url = [NSURL URLWithString:@"www.baidu.com"];
NSURLSessionDownloadTask *task = [session downloadTaskWithURL:url completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        //如果不在这个block中做操作,默认下载的临时文件会被清除
        NSString *cache = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)lastObject];
        NSString *filePath = [cache stringByAppendingPathComponent:response.suggestedFilename];
        
        NSFileManager *fileMgr = [NSFileManager defaultManager];
        [fileMgr moveItemAtPath:location.path toPath:filePath error:nil];
}];

没有下载进度,可以进行改进(利用代理)

NSURLSessionConfiguration *cf = [NSURLSessionConfiguration defaultSessionConfiguration];
    
NSURLSession *session = [NSURLSession sessionWithConfiguration:cf delegate:self delegateQueue:[NSOperationQueue mainQueue]];
    
NSURLSessionDownloadTask *task = [session downloadTaskWithURL:[NSURL URLWithString:@"www.baidu.com"]];
    
[task resume];
<NSURLSessionDownloadDelegate>

实现代理方法

-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location
{
    //下载完成,location为下载完成的临时文件
    NSString *cache = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)lastObject];
    NSString *filePath = [cache stringByAppendingPathComponent:downloadTask.response.suggestedFilename];
    
    NSFileManager *fileMgr = [NSFileManager defaultManager];
    
    [fileMgr moveItemAtPath:location.path toPath:filePath error:nil];
}

-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes
{
    //恢复下载时调用
}

-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite
{
    //下载进度
    //bytesWritten 本次写入多少
    //totalBytesWritten 总计写入多少
    //totalBytesExpectedToWrite 文件总大小
}

断点下载

__weak typeof(self) weakSelf = self;
[self.task cancelByProducingResumeData:^(NSData *resumeData){
      weakSelf.resumeData =resumeData;
      weakSelf.task = nil;
}];
-(void)resume
{
      self.task = [self.session downloadTaskWithResumeData:self.resumeData];
      self.resumeData = nil;
}

只需要一个session就可以。所以封装代码进行懒加载。

-(NSURLSession *)session
{
    if (!_session) {
        NSURLSessionConfiguration *cf = [NSURLSessionConfiguration defaultSessionConfiguration];
        
        NSURLSession *session = [NSURLSession sessionWithConfiguration:cf delegate:self delegateQueue:[NSOperationQueue mainQueue]];
        _session = session;
    }
    return _session;
}

文件上传

#define XUFileBoundary @"xujiguang"
#define XUNewLine @"\r\n"
#define XUEncode(str) [str dataUsingEncoding:NSUTF8StringEncoding];

设置上传参数

AFNetworking使用

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
//params为dictionary
[manager GET:url parameters:params progress:^(NSProgress * _Nonnull downloadProgress) {
    
} success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
    
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
    
}];

上传文件

//1。创建管理者对象 
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

NSDictionary *dict = @{@"username":@"1234"};

NSString *urlString = @"22222";

[manager POST:urlString parameters:dict constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {
   UIImage *iamge = [UIImage imageNamed:@"123.png"];
   NSData *data = UIImagePNGRepresentation(iamge);
   [formData appendPartWithFileData:data name:@"file" fileName:@"123.png" mimeType:@"image/png"];
   //[formData appendPartWithFileURL:[NSURL fileURLWithPath:@"文件地址"] name:@"file" fileName:@"1234.png" mimeType:@"application/octet-stream" error:nil];å
} progress:^(NSProgress * _Nonnull uploadProgress) {
   //打印上传进度
   NSLog(@"%lf",1.0 *uploadProgress.completedUnitCount / uploadProgress.totalUnitCount);
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {

} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {

}];

AFN监听网络状态

AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];

[manager setReachabilityStatusChangeBlock:^(AFNetworkReachability status) {
   switch(status) {
      case AFNetworkReachabilityStatusReachableViaWiFi:
(ViaWWAN、NotReachable、Unknown)
   }
}];

[manager startMonitoring];
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,761评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,953评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,998评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,248评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,130评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,145评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,550评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,236评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,510评论 1 291
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,601评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,376评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,247评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,613评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,911评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,191评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,532评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,739评论 2 335

推荐阅读更多精彩内容

  • 13.服务器图片改了,url没有变,需求,服务器的图片变了,就从服务器加载图片,如果服务器的没变,就从本地加载 1...
    AlanGe阅读 1,125评论 0 1
  • iOS开发系列--网络开发 概览 大部分应用程序都或多或少会牵扯到网络开发,例如说新浪微博、微信等,这些应用本身可...
    lichengjin阅读 3,619评论 2 7
  • 1.NSURLSession 本节主要涉及NSURLSession的两个get请求/一个post请求NSURLSe...
    SoftKnife阅读 2,498评论 9 19
  • 目录 网络基本概念 TCP/IP协议簇基本概念 HTTP 网络开发技术解决方案 数据解析 网络优化 1. 网络基本...
    Ryan___阅读 1,340评论 1 0
  • 《我的诗词》目录[https://www.jianshu.com/p/b6c7e3b79bbd]...
    青梅梦语阅读 501评论 2 4