单军华
2018-07-12 3e8437ae559487362fae3525beb79c534c213a51
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
//
//  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