IOS開發---菜鳥學習之路--(十三)-利用MBProgressHUD進行異步獲取數據


本章將介紹如何利用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"
@interface NEWSViewController : UIViewController< MBProgressHUDDelegate,PullingRefreshTableViewDelegate,UITableViewDelegate,UITableViewDataSource>{
    NSInteger allcount;
    MBProgressHUD *HUD;
}
@property(nonatomic,retain) NSString *pid;
@property(nonatomic,assign) NSInteger allcount;
@property (nonatomic) BOOL refreshing;//是否刷新
@property (assign,nonatomic) NSInteger page;//頁數
@property (retain,nonatomic) PullingRefreshTableView *tableView; //tableview
@property (retain,nonatomic) NSMutableArray *list;//數據
@end

需要引入頭文件MBProgressHUD.h

然后添加代理MBProgressHUDDelegate

接着增加一個屬性MBProgressHUD *HUD;

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

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

#pragma mark -
#pragma mark MBProgressHUDDelegate methods

- (void)hudWasHidden:(MBProgressHUD *)hud {
    // Remove HUD from screen when the HUD was hidded
    [HUD removeFromSuperview];
    HUD = nil;
}

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

    HUD = [[MBProgressHUD alloc] initWithView:self.view];
    [self.view addSubview:HUD];
    HUD.delegate = self;
    HUD.labelText = @"正在加載數據";
    HUD.dimBackground = YES;
    [HUD showWhileExecuting:@selector(initListData) onTarget:self withObject:nil animated:YES];

修改后的loadView代碼是這樣子的

//加載界面
- (void)loadView
{
    [super loadView];
    _list = [[NSMutableArray alloc] init ];//初始化
    //_list=[[NSMutableArray alloc] initWithObjects:@"123",@"123",@"123", nil];
    _page=1;
    CGRect bounds = self.view.bounds;
    bounds.size.height -= 120.f;
    _tableView = [[PullingRefreshTableView alloc] initWithFrame:bounds style:UITableViewStyleGrouped];
    _tableView.pullingDelegate=self;
    _tableView.dataSource = self;
    _tableView.delegate = self;
    [self.view addSubview:_tableView];
    
    HUD = [[MBProgressHUD alloc] initWithView:self.view];
    [self.view addSubview:HUD];
    HUD.delegate = self;
    HUD.labelText = @"正在加載數據";
    HUD.dimBackground = YES;
    [HUD showWhileExecuting:@selector(initListData) onTarget:self withObject:nil animated:YES];
}
 

initListData 的話就是我們最早使用GetWebInfo的版本我這邊再復制一遍放在下面,方便大家查看

-(void) initListData
{

    GetWebInfo *getwebinfo=[GetWebInfo alloc];
    NSString *myparameters=[[NSString alloc] initWithString:[NSString stringWithFormat:@"Method=GetNewsbyPage&type=公共新聞&rows=4&page=%d",_page]];
    getwebinfo.parameters=myparameters;
    NSString *webReturnMessage=[getwebinfo dogetWebInfo];

    NSData* jsonData=[webReturnMessage dataUsingEncoding:NSUTF8StringEncoding];
    NSArray *keys =   [NSJSONSerialization
                       JSONObjectWithData:jsonData
                       options:NSJSONReadingMutableContainers
                       error:nil];
    allcount=[[keys valueForKey:@"total"] integerValue];
    [self.list addObject:[keys valueForKey:@"rows"]];
    [_tableView reloadData];
    //NSLog(@"%@",_list);
    // [self.list addObjectsFromArray:[keys valueForKey:@"rows"]];

}

OK這樣。。就完成了我們的異步數據獲取。怎么樣是不是都非常簡單呀?

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM