您的位置:首页 > 移动开发 > IOS开发

IOS开发---菜鸟学习之路--(十三)-利用MBProgressHUD进行异步获取数据

2013-12-23 20:55 696 查看
本章将介绍如何利用MBProgressHUD实现异步处理数据。

其实我本来只是像实现一个加载数据时提示框的效果,然后问了学长知道了这个类,然后就使用了

接着就发现了一个“BUG”再然后就发现原来MBProgressHUD处理数据的时候是异步处理的

而所谓的“BUG”其实是在我实现了ASIFormDataRequest异步处理数据后又利用MBProgressHUD来显示加载数据框所导致的。

具体的BUG效果就是使用MBProgressHUD后提示信息只是闪一下就没了,但是数据还没加载过来,按理说应该是数据加载过来时候提示框才会消失的。

为什么会有这样的BUG呢?

其实大家在知道了MBProgressHUD也是异步处理后就能很轻松的想明白了

那是因为MBProgressHUD异步处理ASIFormDataRequest部分的获取数据,而ASIFormDataRequest也是异步处理的。

所以在MBProgressHUD调用ASIFormDataRequest的时候ASIFormDataRequest直接先返回PASS让他通过,自己去异步处理数据。

这就好像A叫B去买东西,B直接告诉A买好了,你直接开始下一步吧,但是实际上B叫了C去买菜。

好了直接拷贝下面一段内容也免的大家自己再百度了,

(地址是http://blog.csdn.net/ryantang03/article/details/7877120)可以了解细节。

MBProgressHUD是一个开源项目,实现了很多种样式的提示框,使用上简单、方便,并且可以对显示的内容进行自定义,功能很强大,很多项目中都有使用到。到GitHub上可以下载到项目源码https://github.com/jdg/MBProgressHUD,下载下来后直接把MBProgressHUD.h和MBProgressHUD.m拖入工程中就行,别忘了选择拷贝到工程。

看完上面的内容的话,我直接从实践出发告诉大家如何利用MBProgressHUD实现异步数据获取

首先是.H文件的修改

#import<UIKit/UIKit.h>
#import"PullingRefreshTableView.h"
#import"MBProgressHUD.h"
@interfaceNEWSViewController:UIViewController<MBProgressHUDDelegate,PullingRefreshTableViewDelegate,UITableViewDelegate,UITableViewDataSource>{
NSIntegerallcount;
MBProgressHUD*HUD;
}
@property(nonatomic,retain)NSString*pid;
@property(nonatomic,assign)NSIntegerallcount;
@property(nonatomic)BOOLrefreshing;//是否刷新
@property(assign,nonatomic)NSIntegerpage;//页数
@property(retain,nonatomic)PullingRefreshTableView*tableView;//tableview
@property(retain,nonatomic)NSMutableArray*list;//数据
@end


需要引入头文件MBProgressHUD.h

然后添加代理MBProgressHUDDelegate

接着增加一个属性MBProgressHUD*HUD;

完整了.h文件后就是.M文件了

.m文件的话首先需要增加一个如下的方法

#pragmamark-
#pragmamarkMBProgressHUDDelegatemethods

-(void)hudWasHidden:(MBProgressHUD*)hud{
//RemoveHUDfromscreenwhentheHUDwashidded
[HUDremoveFromSuperview];
HUD=nil;
}


接着在loadView部分增加如下代码

HUD=[[MBProgressHUDalloc]initWithView:self.view];
[self.viewaddSubview:HUD];
HUD.delegate=self;
HUD.labelText=@"正在加载数据";
HUD.dimBackground=YES;
[HUDshowWhileExecuting:@selector(initListData)onTarget:selfwithObject:nilanimated:YES];


修改后的loadView代码是这样子的

//加载界面
-(void)loadView
{
[superloadView];
_list=[[NSMutableArrayalloc]init];//初始化
//_list=[[NSMutableArrayalloc]initWithObjects:@"123",@"123",@"123",nil];
_page=1;
CGRectbounds=self.view.bounds;
bounds.size.height-=120.f;
_tableView=[[PullingRefreshTableViewalloc]initWithFrame:boundsstyle:UITableViewStyleGrouped];
_tableView.pullingDelegate=self;
_tableView.dataSource=self;
_tableView.delegate=self;
[self.viewaddSubview:_tableView];

HUD=[[MBProgressHUDalloc]initWithView:self.view];
[self.viewaddSubview:HUD];
HUD.delegate=self;
HUD.labelText=@"正在加载数据";
HUD.dimBackground=YES;
[HUDshowWhileExecuting:@selector(initListData)onTarget:selfwithObject:nilanimated:YES];
}



initListData的话就是我们最早使用GetWebInfo的版本我这边再复制一遍放在下面,方便大家查看

-(void)initListData
{

GetWebInfo*getwebinfo=[GetWebInfoalloc];
NSString*myparameters=[[NSStringalloc]initWithString:[NSStringstringWithFormat:@"Method=GetNewsbyPage&type=公共新闻&rows=4&page=%d",_page]];
getwebinfo.parameters=myparameters;
NSString*webReturnMessage=[getwebinfodogetWebInfo];

NSData*jsonData=[webReturnMessagedataUsingEncoding:NSUTF8StringEncoding];
NSArray*keys=[NSJSONSerialization
JSONObjectWithData:jsonData
options:NSJSONReadingMutableContainers
error:nil];
allcount=[[keysvalueForKey:@"total"]integerValue];
[self.listaddObject:[keysvalueForKey:@"rows"]];
[_tableViewreloadData];
//NSLog(@"%@",_list);
//[self.listaddObjectsFromArray:[keysvalueForKey:@"rows"]];

}


OK这样。。就完成了我们的异步数据获取。怎么样是不是都非常简单呀?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐