美文网首页
聚合获取网络接口数据

聚合获取网络接口数据

作者: 本客 | 来源:发表于2018-12-20 15:27 被阅读0次

这是一个获取聚合网络上的黄金数据,把获取到的数据展示在表格上

首先需要导入4个SDK,分别是  MJRefresh   用于刷新界面的SDK  ;

                                              MBProgressHUD   用于弹出提示信息;

                                              libWeiboSDK 微博的SDK

                                              WeChatSDK1.8.3_NoPay  微信的SDK

如下图所示:

首先需要在viewController.m中导入头文件,如图:

在viewController.m中定义3个属性,分别表示,表格的数据源,表格,下拉刷新控件; 其中表格数据源用全局的变量表示;如图:

初始化表格视图,记得遵守协议

//初始化表格视图

    self.tbv=[[UITableView alloc]initWithFrame:self.view.frame style:UITableViewStylePlain];

    //注册单元格

    [self.tbv registerNib:[UINib nibWithNibName:@"GoldTableViewCell" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:@"string"];

self.tbv.delegate=self;

self.tbv.dataSource=self;

 [self.viewaddSubview:self.tbv];

 //实例化下拉刷新控件

    self.mjHeaderView =[[MJRefreshHeaderView alloc]initWithScrollView:self.tbv];

 //做一个弱引用

    __weak typeof(self)weakSelf=self;

    //下拉回调的代码

    self.mjHeaderView.beginRefreshingBlock = ^(MJRefreshBaseView *refreshView) {

        [weakSelfgetHttpData];

    };

    //把弹出的视图置在屏幕的最前方

    [self.view bringSubviewToFront:self.shareView];

//几行

-(NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section

{

    return tableDataArr.count;

}

//设置表格的cell

-(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath

{

     staticNSString* string=@"string";

//设置cell时,不是UITabViewCell,而是用自己的定义的GoldTableViewCell,以下会提到

     GoldTableViewCell * cell=[tableView dequeueReusableCellWithIdentifier:string forIndexPath:indexPath];

    //获取cell对应的model对象

    Gold* gold =tableDataArr[indexPath.row];

    //cell赋值

    cell.variety.text=gold.variety;

    cell.latestpri.text=gold.latestpri;

    cell.openpri.text=gold.openpri;

    cell.maxpri.text=gold.maxpri;

    cell.minpri.text=gold.minpri;

    returncell;

}

接下里创建一个view视图,就是为了连接上面cell中的cell的样式,创建一个类,让他继承于UITableViewCell,记得勾上xib选项,因为要用到脱线拖拽cell中的子控件,子控件全部都是属性

如图所示:

下面开始脱线,把所有的种类lable 拖拽到GoldTableViewCell.h中

然后再创建一个model模型,为了获取数据时赋值,让他继承自NSObject,如图所示:


在Gold.h中定义属性,一定要和聚合上的数据属性一致,不能少一个,不然表格赋值时会崩溃

@property(nonatomic,copy)NSString* variety;  //品种

@property(nonatomic,copy)NSString * latestpri;//最新价

@property(nonatomic,copy)NSString* openpri;  //开盘价

@property(nonatomic,copy)NSString* maxpri;  //最高价

@property(nonatomic,copy)NSString* minpri;  //最低价

@property(nonatomic,copy)NSString* limit;    //跌涨幅

@property(nonatomic,copy)NSString* yespri;  //昨收价

@property(nonatomic,copy)NSString * totalvol; //总成交量

@property(nonatomic,copy)NSString* time;    //更新时间

回到ViewController.m中,导入两个头文件   #import "GoldTableViewCell.h"   和  #import"Gold.h"

在 viewDidLoad 中写入下面调用的自定义方法

//获取自定义的网络数据

    [self getHttpData];

然后写入获取聚合网络数据的方法实现

//获取网络数据

-(void)getHttpData

{

    //等待指示器显示

    [UIApplication sharedApplication].networkActivityIndicatorVisible=YES;

    //网址字符串拼接

    NSString * urlStr=[NSString stringWithFormat:@"http://web.juhe.cn:8080/finance/gold/shgold?key=%@&v=1",@"1b9f570e367ce24e51135d69eac7d04e"];

    //如果网址字符串中有汉字,对汉字做处理

    urlStr=[urlStrstringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLFragmentAllowedCharacterSet]];

    //网址对象

    NSURL* url=[NSURLURLWithString:urlStr];

    //做成请求对象,设置缓存策略和超时时长

    NSURLRequest * req=[NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:5.0];

    //请求网络数据

    [[[NSURLSessionsharedSession]dataTaskWithRequest:reqcompletionHandler:^(NSData*_Nullabledata,NSURLResponse*_Nullableresponse,NSError*_Nullableerror) {

        //停止菊花转动

        dispatch_async(dispatch_get_main_queue(), ^{

            [UIApplication sharedApplication].networkActivityIndicatorVisible=NO;

            //停止下拉刷新

            [self.mjHeaderViewendRefreshing];

        });

        //如果发生服务器或超时错误,给提示

        if(error!=nil)

        {

        dispatch_async(dispatch_get_main_queue(), ^{

            [self showMBAlertWithMessage:@"服务器错误"];

        });

            return;

        }

        //json数据转换

        NSError* jsonError=nil;

        id jsonData=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&jsonError];

        //如果转换失败

        if(jsonError!=nil)

        {

            dispatch_async(dispatch_get_main_queue(), ^{

                [self showMBAlertWithMessage:@"网络数据错误"];

            });

            return;

        }

        //得到接口数据resultcode=200字段的值

        intresultcode=[jsonData[@"resultcode"]intValue];

        //如果不是200,表示发生错误

        if(resultcode!=200)

        {

            dispatch_async(dispatch_get_main_queue(), ^{

                [selfshowMBAlertWithMessage:jsonData[@"reason"]];

            });

            return;

        }

        //获取result字段对应的数组

        NSArray* resultArr=jsonData[@"result"];

        //获取数组中的大字典

        NSDictionary* allDic=[resultArrfirstObject];

        //实例化一个可变数组,用于储存model对象

        NSMutableArray * modeArr=[[NSMutableArray alloc]init];

        //遍历大字典中所有的小字典

        for(idkeyinallDic) {

            NSDictionary* dic=[allDicobjectForKey:key];

            Gold* g=[[Goldalloc]init];

            [gsetValuesForKeysWithDictionary:dic];

            [modeArraddObject:g];

        }

        //将modeArr数组赋值给表格数组,刷新表格

        dispatch_async(dispatch_get_main_queue(), ^{

            self->tableDataArr=[modeArrcopy];

            [self.tbvreloadData];

        });

    }]resume];

}

接下来封装提示框的方法

//显示提示框的封装方法

-(void)showMBAlertWithMessage:(NSString*)msg

{

    MBProgressHUD * hud=[[MBProgressHUD alloc]initWithView:self.view];

    hud.mode=MBProgressHUDModeText;

    hud.removeFromSuperViewOnHide=YES;

    hud.labelText=msg;

    [self.viewaddSubview:hud];

    [hudshow:YES];

    [hudhide:YES afterDelay:3.0];

}

这样就做完了网络获取数据的代码,接下来在这个基础上做点击单元格实现分享当前单元格内容的方法

在全局变量中定义个全局变量 NSString* shareString;//分享的文本内容

首先需要定义一个属性,为了点击单元格弹出分享的视图,在这里咱们就用一个UIview来做

@property(nonatomic,strong)UIView * shareView;//分享视图

在 @interface ViewController ()<UITableViewDelegate,UITableViewDataSource> 上面设置两个宏定义,一个是屏幕的宽,一个是屏幕的高

#define SCR_W  [UIScreen mainScreen].bounds.size.width

#define SCR_H  [UIScreen mainScreen].bounds.size.height

然后用懒加载实现分享视图

//分享视图实例化

-(UIView* )shareView

{

    if(!_shareView)

    {

        _shareView=[[UIView alloc]initWithFrame:CGRectMake(0, SCR_H, SCR_W, 200)];

        _shareView.backgroundColor=[UIColor lightGrayColor];

        //单击手势

        UITapGestureRecognizer * tap=[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(hideShareView:)];

        [_shareView addGestureRecognizer:tap];

        //按钮标题数组

        NSArray* btnTitles=@[@"微信好友",@"朋友圈",@"QQ",@"微博"];

        //设置按钮的宽度

        CGFloatbtnW=60;

        //按钮间的距离

        CGFloatdis=(SCR_W-btnW*btnTitles

                     .count)/(btnTitles.count+1);

        //使用for循环构建按钮

        for(inti=0; i

            //实例化

            UIButton * btn=[UIButton buttonWithType:UIButtonTypeCustom];

            //设置位置

            btn.frame=CGRectMake(dis+(dis+btnW)*i,70, btnW, btnW);

            //做成圆角

            btn.clipsToBounds=YES;

            btn.layer.cornerRadius=btnW/2;

            //设置标题

            [btnsetTitle:btnTitles[i] forState:UIControlStateNormal];

            //设置背景颜色

            btn.backgroundColor=[UIColor blueColor];

            //设置字体的颜色

            [btnsetTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];

            //设置tag值,为了区分点击的哪一个按钮

            btn.tag=100+1;

            [btnaddTarget:self action:@selector(shareBtnDidPress:) forControlEvents:UIControlEventTouchUpInside];

            //添加到分享视图上

            [_shareViewaddSubview:btn];

        }

    }

    return _shareView;

}

再创建一个点击单元格的方法

-(void)tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath

{

    //得到选中cell对应的model

    Gold* gold=[tableDataArrobjectAtIndex:indexPath.row];

    //分享字符串赋值

    shareString=[NSStringstringWithFormat:@"黄金%@,最新报价%@元,最高%@元,最低%@元",gold.variety,gold.latestpri,gold.maxpri,gold.minpri];

    //加一个弹出的时间间隔

    [UIView animateWithDuration:0.138 animations:^{

        //显示分享视图

        self.shareView.frame=CGRectMake(0,SCR_H-200,SCR_W,200);

    }];

}

点击分享视图,隐藏分享视图的方法

//隐藏分享视图

-(void)hideShareView:(id)sender

{

    //视图隐藏的时间

    [UIView animateWithDuration:0.138 animations:^{

        //隐藏按钮视图

        self.shareView.frame=CGRectMake(0,SCR_H,SCR_W,200);

    }];

}

在AppDelegate.m中写

#import "libWeiboSDK/WeiboSDK.h"

#define weibo_AppKey        @"3970277534"

#define weibo_RedirectURI    @"https://www.sina.com"

#define weixin_AppKey    @"wx324a10d04bd2cd5c"

//微信回调方法

-(void) onResp:(BaseResp*)resp

{

 //授权登录回调

    if([resp isKindOfClass:[SendAuthResp class]])

    {

    }

    //分享回调

    else if([resp isKindOfClass:[SendMessageToWXReq class]])

    {

    }

}

 //向微信注册

    [WXApi registerApp:weixin_AppKey];

    //向微博去注册

     [WeiboSDK registerApp:weibo_AppKey];

- (BOOL)application:(UIApplication*)application handleOpenURL:(NSURL*)url {

    //获取回调的网址字符串

    NSString * urlstr=url.absoluteString;

    if([urlstrcontainsString:weixin_AppKey])

    {

        return  [WXApi handleOpenURL:url delegate:self];

    }

    elseif([urlstrcontainsString:weibo_AppKey])

    {

        return [WeiboSDK handleOpenURL:url delegate:self];

    }

    return nil;

}

- (BOOL)application:(UIApplication*)application openURL:(NSURL*)url sourceApplication:(NSString*)sourceApplication annotation:(id)annotation {

    return [WXApi handleOpenURL:url delegate:self];

}

遵守协议

@interface AppDelegate ()<WXApiDelegate,WeiboSDKDelegate>

回到ViewController.m

//分享按钮触发方法

-(void)shareBtnDidPress:(UIButton* )sender

{

    //隐藏分享视图

    [self hideShareView:nil];

    switch(sender.tag) {

        case100://微信好友

        {

            NSLog(@"微信好友分享");

            SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init];

            req.bText=YES;

            req.text=shareString;

            req.scene=WXSceneSession;

            [WXApisendReq:req];

        }

            break;

        case101://朋友圈

        {

            NSLog(@"朋友圈分享");

            SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init];

            req.bText=YES;

            req.text=shareString;

            req.scene=WXSceneTimeline;

            [WXApisendReq:req];

        }

            break;

        case102://QQ

        {

            NSLog(@"QQ分享");

        }

            break;

        case103://微博

        {

            NSLog(@"微博分享");

            //实例化分享的帝乡

            WBMessageObject *message = [WBMessageObject message];

            //分享的样式是文本样式

            message.text=shareString;

            //分享样式为照片

            UIImage* img=[UIImageimageNamed:@"1.jpeg"];

            WBImageObject* imageObject=[WBImageObjectobject];

            imageObject.imageData=UIImageJPEGRepresentation(img,1.0);

            message.imageObject=imageObject;

            //分享的样式为网址

            //message.mediaObject=@"";

            //分享的样式为视频

            //message.videoObject=@"";

            //将信息分享

            WBSendMessageToWeiboRequest * request=[[WBSendMessageToWeiboRequest alloc]init];

            request.message=message;

            [WeiboSDKsendRequest:request];

        }

            break;

        default:

            break;

    }

}

依赖库第一个官方文档上没有提到


相关文章

网友评论

      本文标题:聚合获取网络接口数据

      本文链接:https://www.haomeiwen.com/subject/ofdykqtx.html