//
|
// NetworkDemo.m
|
// PPNetworkHelper
|
//
|
// Created by AndyPang on 16/8/12.
|
// Copyright © 2016年 AndyPang. All rights reserved.
|
//
|
|
/*
|
*********************************************************************************
|
*
|
*⭐️⭐️⭐️ 新建 PP-iOS学习交流群: 323408051 欢迎加入!!! ⭐️⭐️⭐️
|
*
|
* 如果您在使用 PPNetworkHelper 的过程中出现bug或有更好的建议,还请及时以下列方式联系我,我会及
|
* 时修复bug,解决问题.
|
*
|
* Weibo : jkpang-庞
|
* Email : jkpang@outlook.com
|
* QQ 群 : 323408051
|
* GitHub: https://github.com/jkpang
|
*
|
* PS:我的另外两个很好用的封装,欢迎使用!
|
* 1.一行代码获取通讯录联系人,并进行A~Z精准排序(已处理姓名所有字符的排序问题):
|
* GitHub:https://github.com/jkpang/PPGetAddressBook
|
* 2.iOS中一款高度可定制性商品计数按钮(京东/淘宝/饿了么/美团外卖/百度外卖样式):
|
* GitHub:https://github.com/jkpang/PPNumberButton
|
*
|
* 如果 PPGetAddressBookSwift 好用,希望您能Star支持,你的 ⭐️ 是我持续更新的动力!
|
*********************************************************************************
|
*/
|
|
#import "NetworkDemo.h"
|
#import "PPNetworkHelper.h"
|
#import "PPHTTPRequest.h"
|
#import "AFNetworking.h"
|
#import "BaseResModel.h"
|
#import "Global.h"
|
|
#ifdef DEBUG
|
#define PPLog(...) printf("[%s] %s [第%d行]: %s\n", __TIME__ ,__PRETTY_FUNCTION__ ,__LINE__, [[NSString stringWithFormat:__VA_ARGS__] UTF8String])
|
#else
|
#define PPLog(...)
|
#endif
|
|
|
static NSString *const dataUrl = @"http://api.budejie.com/api/api_open.php";
|
static NSString *const downloadUrl = @"http://wvideo.spriteapp.cn/video/2016/0328/56f8ec01d9bfe_wpd.mp4";
|
|
@interface NetworkDemo ()
|
|
@property (weak, nonatomic) IBOutlet UITextView *networkData;
|
@property (weak, nonatomic) IBOutlet UITextView *cacheData;
|
@property (weak, nonatomic) IBOutlet UILabel *cacheStatus;
|
@property (weak, nonatomic) IBOutlet UISwitch *cacheSwitch;
|
@property (weak, nonatomic) IBOutlet UIProgressView *progress;
|
@property (weak, nonatomic) IBOutlet UIButton *downloadBtn;
|
|
/** 是否开启缓存*/
|
@property (nonatomic, assign, getter=isCache) BOOL cache;
|
|
/** 是否开始下载*/
|
@property (nonatomic, assign, getter=isDownload) BOOL download;
|
@end
|
|
@implementation NetworkDemo
|
|
- (void)viewDidLoad {
|
[super viewDidLoad];
|
|
/**
|
设置网络请求参数的格式:默认为二进制格式
|
PPRequestSerializerJSON(JSON格式),
|
PPRequestSerializerHTTP(二进制格式)
|
|
设置方式 : [PPNetworkHelper setRequestSerializer:PPRequestSerializerHTTP];
|
*/
|
|
/**
|
设置服务器响应数据格式:默认为JSON格式
|
PPResponseSerializerJSON(JSON格式),
|
PPResponseSerializerHTTP(二进制格式)
|
|
设置方式 : [PPNetworkHelper setResponseSerializer:PPResponseSerializerJSON];
|
*/
|
|
/**
|
设置请求头 : [PPNetworkHelper setValue:@"value" forHTTPHeaderField:@"header"];
|
*/
|
|
// 开启日志打印
|
[PPNetworkHelper openLog];
|
|
[PPNetworkHelper setRequestSerializer:PPRequestSerializerJSON];
|
|
// 获取网络缓存大小
|
PPLog(@"网络缓存大小cache = %fKB",[PPNetworkCache getAllHttpCacheSize]/1024.f);
|
|
// 清理缓存 [PPNetworkCache removeAllHttpCache];
|
|
// 实时监测网络状态
|
[self monitorNetworkStatus];
|
|
/*
|
* 一次性获取当前网络状态
|
这里延时0.1s再执行是因为程序刚刚启动,可能相关的网络服务还没有初始化完成(也有可能是AFN的BUG),
|
导致此demo检测的网络状态不正确,这仅仅只是为了演示demo的功能性, 在实际使用中可直接使用一次性网络判断,不用延时
|
*/
|
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
|
[self getCurrentNetworkStatus];
|
});
|
|
[self data_upload];
|
}
|
|
/**
|
|
通过封装好的网络层进行请求配 , 我目前的项目是这样做的,在工程中的 PPHTTPRequestLayer 文件夹可以看到
|
当然,不同的项目可以有不同的做法,没有最好的做法,只有最合适的做法,
|
这仅仅是我抛砖引玉, 希望大家能各显神通.
|
*/
|
- (void)PPHTTPRequestLayerDemo
|
{
|
// // 登陆
|
// [PPHTTPRequest getLoginWithParameters:@"参数" success:^(id response) {
|
//
|
// } failure:^(NSError *error) {
|
//
|
// }];
|
//
|
// // 退出
|
// [PPHTTPRequest getExitWithParameters:@"参数" success:^(id response) {
|
//
|
// } failure:^(NSError *error) {
|
//
|
// }];
|
}
|
|
|
-(void)data_upload
|
{
|
|
// UploadModel *model = [[UploadModel alloc] init];
|
//
|
//
|
// model.lat = [NSString stringWithFormat:@"%lf",0.00000];
|
// model.lon = [NSString stringWithFormat:@"%lf",0.00000];
|
// model.userid = @"597bf6a1a0e6d23f5c3c9869";
|
// model.address = @"测试地址";
|
//
|
// NSMutableArray * dataModelArr = [[NSMutableArray alloc] init];
|
// for (int i = 0; i < 10; i++) {
|
// DataModel * model = [[DataModel alloc] init];
|
// model.time = @"2018-04-23 10:09:28";
|
// model.type = @"1";
|
// model.is_warn = @"0";
|
// model.value = @"0.012";
|
// [dataModelArr addObject:model];
|
// }
|
//
|
// model.data = [[NSMutableArray alloc] init];
|
// [model.data addObjectsFromArray:dataModelArr];
|
NSMutableDictionary *param = [[NSMutableDictionary alloc] init];
|
[param setObject:@"15162662339" forKey:@"username"];
|
[param setObject:@"123456" forKey:@"password"];
|
|
// // 登陆
|
// [PPHTTPRequest getLoginWithParameters:param success:^(id responseBody) {
|
// BaseResModel * resModel = [Global toBaseModel:responseBody];
|
// if(resModel.code == 1)
|
// {
|
//
|
// }
|
// } failure:^(NSError *error) {
|
// PPLog(@"网络错误%@",error);
|
// }];
|
|
//[UserDefault stringForKey:@"user_id"]
|
// NSString *path = [[NSString alloc] initWithFormat:DATA_UPLOAD];
|
//
|
// UploadModel *model = [[UploadModel alloc] init];
|
//
|
// //['refresh_frequency', 'video', 'is_open_upload']
|
// //[param setValue:[UserDefault stringForKey:@"user_id"] forKey:@"user_id"];
|
// address = @"测试地址";
|
//
|
// model.lat = [NSString stringWithFormat:@"%lf",latitude];
|
// model.lon = [NSString stringWithFormat:@"%lf",longitude];
|
// model.userid = [UserDefault stringForKey:@"user_id"];
|
// model.address = address;
|
//
|
// model.data = [[NSMutableArray alloc] init];
|
// [model.data addObjectsFromArray:dataModelArr];
|
//
|
// //NSString * tempString = [Global convertToJsonData:model.toDic];
|
// MPWeakSelf(self);
|
// [NetworkSingleton networkingPostMethod:model.toDic urlName:path success:^(id responseBody)
|
// {
|
// MPStrongSelf(self);
|
// BaseResModel * resModel = [Global toBaseModel:responseBody];
|
//
|
// if(resModel.code == 1)
|
// {
|
// [dataModelArr removeAllObjects];
|
//
|
// //[UserDefault setObject:self.is_open_upload forKey:@"is_open_upload"];
|
// [UserDefault synchronize];
|
//
|
// //[self.tableView reloadData];
|
// [Global alertMessageEx:resModel.desc title:@"提示信息" okTtitle:nil cancelTitle:@"OK" delegate:self];
|
// }
|
// else
|
// {
|
// [Global alertMessageEx:resModel.desc title:@"提示信息" okTtitle:nil cancelTitle:@"OK" delegate:self];
|
// }
|
// }
|
// failure:^(NSString *error)
|
// {
|
//
|
// [Global alertMessageEx:error title:@"提示信息" okTtitle:nil cancelTitle:@"OK" delegate:self];
|
// }];
|
}
|
|
#pragma mark - 获取数据请求示例 GET请求自动缓存与无缓存
|
#pragma mark - 这里的请求只是一个演示, 在真实的项目中建议不要这样做, 具体做法可以参照PPHTTPRequestLayer文件夹的例子
|
- (void)getData:(BOOL)isOn url:(NSString *)url
|
{
|
|
[self data_upload];
|
|
NSDictionary *para = @{ @"a":@"list", @"c":@"data",@"client":@"iphone",@"page":@"0",@"per":@"10", @"type":@"29"};
|
// 自动缓存
|
if(isOn)
|
{
|
self.cacheStatus.text = @"缓存打开";
|
self.cacheSwitch.on = YES;
|
[PPNetworkHelper GET:url parameters:para responseCache:^(id responseCache) {
|
// 1.先加载缓存数据
|
self.cacheData.text = [self jsonToString:responseCache];
|
} success:^(id responseObject) {
|
// 2.再请求网络数据
|
self.networkData.text = [self jsonToString:responseObject];
|
} failure:^(NSError *error) {
|
|
}];
|
|
}
|
// 无缓存
|
else
|
{
|
self.cacheStatus.text = @"缓存关闭";
|
self.cacheSwitch.on = NO;
|
self.cacheData.text = @"";
|
|
[PPNetworkHelper GET:url parameters:para success:^(id responseObject) {
|
self.networkData.text = [self jsonToString:responseObject];
|
} failure:^(NSError *error) {
|
|
}];
|
|
}
|
|
}
|
#pragma mark - 实时监测网络状态
|
- (void)monitorNetworkStatus
|
{
|
// 网络状态改变一次, networkStatusWithBlock就会响应一次
|
[PPNetworkHelper networkStatusWithBlock:^(PPNetworkStatusType networkStatus) {
|
|
switch (networkStatus) {
|
// 未知网络
|
case PPNetworkStatusUnknown:
|
// 无网络
|
case PPNetworkStatusNotReachable:
|
self.networkData.text = @"没有网络";
|
[self getData:YES url:dataUrl];
|
PPLog(@"无网络,加载缓存数据");
|
break;
|
// 手机网络
|
case PPNetworkStatusReachableViaWWAN:
|
// 无线网络
|
case PPNetworkStatusReachableViaWiFi:
|
[self getData:[[NSUserDefaults standardUserDefaults] boolForKey:@"isOn"] url:dataUrl];
|
PPLog(@"有网络,请求网络数据");
|
break;
|
}
|
|
}];
|
|
}
|
|
#pragma mark - 一次性获取当前最新网络状态
|
- (void)getCurrentNetworkStatus
|
{
|
if (kIsNetwork) {
|
PPLog(@"有网络");
|
if (kIsWWANNetwork) {
|
PPLog(@"手机网络");
|
}else if (kIsWiFiNetwork){
|
PPLog(@"WiFi网络");
|
}
|
} else {
|
PPLog(@"无网络");
|
}
|
// 或
|
// if ([PPNetworkHelper isNetwork]) {
|
// PPLog(@"有网络");
|
// if ([PPNetworkHelper isWWANNetwork]) {
|
// PPLog(@"手机网络");
|
// }else if ([PPNetworkHelper isWiFiNetwork]){
|
// PPLog(@"WiFi网络");
|
// }
|
// } else {
|
// PPLog(@"无网络");
|
// }
|
}
|
|
#pragma mark - 下载
|
|
- (IBAction)download:(UIButton *)sender {
|
|
static NSURLSessionTask *task = nil;
|
//开始下载
|
if(!self.isDownload)
|
{
|
self.download = YES;
|
[self.downloadBtn setTitle:@"取消下载" forState:UIControlStateNormal];
|
|
task = [PPNetworkHelper downloadWithURL:downloadUrl fileDir:@"Download" progress:^(NSProgress *progress) {
|
|
CGFloat stauts = 100.f * progress.completedUnitCount/progress.totalUnitCount;
|
self.progress.progress = stauts/100.f;
|
|
PPLog(@"下载进度 :%.2f%%,,%@",stauts,[NSThread currentThread]);
|
} success:^(NSString *filePath) {
|
|
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"下载完成!"
|
message:[NSString stringWithFormat:@"文件路径:%@",filePath]
|
delegate:nil
|
cancelButtonTitle:@"确定"
|
otherButtonTitles:nil];
|
[alertView show];
|
[self.downloadBtn setTitle:@"重新下载" forState:UIControlStateNormal];
|
PPLog(@"filePath = %@",filePath);
|
|
} failure:^(NSError *error) {
|
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"下载失败"
|
message:[NSString stringWithFormat:@"%@",error]
|
delegate:nil
|
cancelButtonTitle:@"确定"
|
otherButtonTitles:nil];
|
[alertView show];
|
PPLog(@"error = %@",error);
|
}];
|
|
}
|
//暂停下载
|
else
|
{
|
self.download = NO;
|
[task suspend];
|
self.progress.progress = 0;
|
[self.downloadBtn setTitle:@"开始下载" forState:UIControlStateNormal];
|
}
|
|
|
|
}
|
|
#pragma mark - 缓存开关
|
- (IBAction)isCache:(UISwitch *)sender {
|
[[NSUserDefaults standardUserDefaults] setBool:sender.isOn forKey:@"isOn"];
|
|
[self getData:sender.isOn url:dataUrl];
|
}
|
|
/**
|
* json转字符串
|
*/
|
- (NSString *)jsonToString:(NSDictionary *)dic
|
{
|
if(!dic){
|
return nil;
|
}
|
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:nil];
|
return [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
|
}
|
|
- (void)didReceiveMemoryWarning {
|
[super didReceiveMemoryWarning];
|
// Dispose of any resources that can be recreated.
|
}
|
@end
|