• 天气预报-06-Homerwork-网络


     1 //
     2 //  MyNetworkService.m
     3 //  04-天气预报
     4 //
     5 
     6 #import "MyNetworkService.h"
     7 
     8 #define BASEURL @"http://www.weather.com.cn"
     9 
    10 @implementation MyNetworkService
    11 
    12 + (void)requestDataWithURL:(NSString *)urlString HTTPMethod:(NSString *)method params:(NSMutableDictionary *)params completionHandle:(void (^)(id result , NSURLResponse *response , NSError *error))completionHandle {
    13     
    14     
    15     //1.拼接URL
    16     NSString *requestURLString = [BASEURL stringByAppendingString:urlString];
    17     
    18     //2.构造URL
    19     NSURL *url = [NSURL URLWithString:requestURLString];
    20     
    21     
    22     //3.创建网络请求
    23     NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    24     
    25     request.HTTPMethod = method;
    26     
    27     //4.请求参数 key1=value1&key2=value2&key3=value3
    28     NSMutableString *paramStr = [NSMutableString string];
    29     
    30     for (NSInteger i = 0; i < params.count; i++) {
    31         NSArray *keys = [params allKeys];
    32         NSString *key = keys[i];
    33         NSString *value = params[key];
    34         
    35         [paramStr appendFormat:@"%@=%@", key, value];
    36         //如果是最后一个键值对,则不加&
    37         if (i < params.count - 1) {
    38             [paramStr appendFormat:@"&"];
    39         }
    40         
    41     }
    42     
    43     //如果为GET请求,则请求参数拼接在URL后面
    44     if ([method isEqualToString:@"GET"]) {
    45         
    46         //http://www.baidu.com
    47         //http://www.baidu.com?key1=value1
    48         NSString *seperate = url.query ? @"&" : @"?";
    49         NSString *newUrlString = [NSString stringWithFormat:@"%@%@%@", requestURLString, seperate,paramStr];
    50         
    51         //重新设置加入了请求参数的URL
    52         request.URL = [NSURL URLWithString:newUrlString];
    53         
    54         
    55         
    56     }
    57     //如果为POST请求,则请求参数放到请求体中
    58     else if ([method isEqualToString:@"POST"]) {
    59         
    60         request.HTTPBody = [paramStr dataUsingEncoding:NSUTF8StringEncoding];
    61     }
    62     
    63     //5.创建session
    64     NSURLSession *session = [NSURLSession sharedSession];
    65     
    66     NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
    67         
    68         //判断是否请求成功,成功才解析JSON,并回到主线程更新UI
    69         if (!error) {
    70             //解析JSON
    71             NSJSONSerialization *json = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
    72             
    73             
    74             dispatch_async(dispatch_get_main_queue(), ^{
    75                 completionHandle(json, response, error);
    76             });
    77 
    78         }
    79         
    80         
    81     }];
    82     
    83     [task resume];
    84   
    85 }
    86 
    87 
    88 @end
    //
    //  MyNetworkService.h
    //  04-天气预报
    //
    
    #import <Foundation/Foundation.h>
    
    @interface MyNetworkService : NSObject
    
    
    + (void)requestDataWithURL:(NSString *)urlString HTTPMethod:(NSString *)method params:(NSMutableDictionary *)params completionHandle:(void (^) (id result, NSURLResponse *response, NSError *error))completionHandle;
    
    
    @end
      1 //
      2 //  ViewController.m
      3 //  04-天气预报
      4 //
      5 #import "ViewController.h"
      6 #import "MyNetworkService.h"
      7 
      8 
      9 @interface ViewController ()
     10 
     11 @end
     12 
     13 @implementation ViewController
     14 {
     15     //创建字典保存城市数据。创建数组保存城市名。
     16     NSDictionary *_data;
     17     NSArray *_cities;
     18     
     19 }
     20 
     21 - (void)viewDidLoad {
     22     [super viewDidLoad];
     23     
     24     //通过plist文件获取城市数组。
     25     NSString *filePath = [[NSBundle mainBundle] pathForResource:@"cityCode" ofType:@"plist"];
     26     _data = [NSDictionary dictionaryWithContentsOfFile:filePath];
     27     _cities = [_data allKeys];
     28     
     29     
     30     //刚进入时请求第一个城市的网络数据
     31     [self pickerView:self.pickerView didSelectRow:0 inComponent:0];
     32     
     33     
     34     
     35 }
     36 
     37 
     38 - (void)refreshUI:(NSDictionary *)result {
     39     //大字典里key:weatherinfo
     40     //value:小字典。
     41     NSDictionary *weatherinfo = [result objectForKey:@"weatherinfo"];
     42     
     43     
     44     NSString *windLevel = weatherinfo[@"WS"];
     45     NSString *temp = weatherinfo[@"temp"];
     46     NSString *city = weatherinfo[@"city"];
     47     NSString *windDirection = weatherinfo[@"WD"];
     48     NSString *time = weatherinfo[@"time"];
     49     
     50     _tempLabel.text = [NSString stringWithFormat:@"温度:%@",temp];
     51     _windLevelLabel.text = [NSString stringWithFormat:@"风级:%@",windLevel];
     52     _cityLabel.text = [NSString stringWithFormat:@"城市:%@",city];
     53     _windDirLabel.text = [NSString stringWithFormat:@"风向:%@",windDirection];
     54     _publicTimeLabel.text = [NSString stringWithFormat:@"发布时间:%@",time];
     55     
     56 }
     57 
     58 
     59 
     60 #pragma mark - UIPickeView Delegate
     61 
     62 //列数
     63 - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
     64     
     65     return 1;
     66 }
     67 
     68 //根据城市个数获取行数
     69 - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
     70     return _cities.count;
     71 }
     72 
     73 //每行的标题
     74 - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
     75     NSString *cityName = _cities[row];
     76     return cityName;
     77 }
     78 
     79 //选中某行时调用的协议方法
     80 - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
     81     
     82     //网络加载方法
     83     [self loadWeatherWithCityIndex:row];
     84     
     85 }
     86 
     87 
     88 
     89 - (void)loadWeatherWithCityIndex:(NSInteger)index {
     90     
     91     //获取被选中的城市名称
     92     NSString *cityName = _cities[index];
     93     
     94     //获取城市id
     95     NSString *cityID = _data[cityName];
     96     
     97     
     98     //根据城市ID拼接URL
     99     NSString *urlString = [NSString stringWithFormat:@"/data/sk/%@.html", cityID];
    100     
    101     
    102     [MyNetworkService requestDataWithURL:urlString HTTPMethod:@"GET" params:nil completionHandle:^(id result, NSURLResponse *response, NSError *error) {
    103         
    104         NSLog(@"result:%@", result);
    105         
    106         [self refreshUI:result];
    107         
    108     }];
    109     
    110     
    111 }
    112 
    113 
    114 
    115 
    116 @end
    时光见证了成长,还很无知,我想一点点幼稚转为有知!
  • 相关阅读:
    慎用rm -rf
    Jquery 中a||""的含义
    【学习、总结】Spring security 登陆超时处理
    Eclipse 无限编译Invoking 'Maven Project Builder'导致卡主
    For多重循环 break continue
    随机编码的生成
    QQ互联Oauth2.0认证测试
    Java开发工程师(Web方向)
    Java开发工程师(Web方向)
    前端开发工程师
  • 原文地址:https://www.cnblogs.com/foreveriOS/p/5433105.html
Copyright © 2020-2023  润新知