NSURLConnection 异步请求

本文介绍了一个iOS应用中实现异步请求和数据加载的方法。通过使用SVProgressHUD显示加载状态,并利用NSURLConnection进行网络请求,同时展示了如何解析JSON数据并更新UITableView的内容。此外,还实现了MJRefresh组件来支持下拉刷新和上拉加载更多功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

导入第三方库SVProgressHUD

#import "ViewController.h"
#import "SVProgressHUD.h"
#import "MJRefresh.h"

#define URLSTR @"http://api.cy.daoyoudao.com/app/categorylist.do?groupid=10986&shopid=12185&clientid=201406022338385212253&curpage=1&pagesize=50&versionrelease=ios_"

@interface ViewController ()<UITableViewDelegate,UITableViewDataSource,NSURLConnectionDelegate,NSURLConnectionDataDelegate>

@property(retain)NSMutableArray * dataSource;
@property(retain)UITableView * tableView;
@property(retain)NSMutableData * muData;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    _muData=[NSMutableData new];
    self.automaticallyAdjustsScrollViewInsets=NO;
    self.title=@"异步请求doem";
    self.view.backgroundColor=[UIColor whiteColor];
    self.navigationItem.rightBarButtonItem=[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemSearch target:self action:@selector(rightAction)];

    _dataSource=[NSMutableArray new];

    _tableView=[[UITableView alloc]initWithFrame:CGRectMake(0, 64, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height-64) style:UITableViewStylePlain];
    _tableView.delegate=self;
    _tableView.dataSource=self;
    [self.view addSubview:_tableView];
    _tableView.tableFooterView=[[UIView alloc]initWithFrame:CGRectZero];
    __weak __typeof(&*self)weakSelf=self;
    //添加表格的头部刷新
   // [_tableView addGifHeaderWithRefreshingTarget:self refreshingAction:@selector(reflshData)];
    [_tableView addLegendHeaderWithRefreshingBlock:^{
        [weakSelf.tableView.header beginRefreshing];
        [weakSelf rightAction];
    }];
    //添加尾部刷新
    [_tableView addLegendFooterWithRefreshingBlock:^{
        [weakSelf.tableView.footer beginRefreshing];
        [weakSelf rightAction];
    }];
   // _tableView.header=[MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadNewTopics)];

}
//-(void)reflshData
//{
//    [self rightAction];
//    [_tableView removeHeader];
//    NSLog(@"头部刷新");
//}
//加载数据
-(void)rightAction
{
    [SVProgressHUD showInView:self.view status:@"正在数据加载。。。。"];
    NSURL * url=[NSURL URLWithString:URLSTR];
    //NSURLRequest * request=[NSURLRequest requestWithURL:url];
    //第一个参数是url参数
    //第二个参数是缓存策略,当前NSURLRequestUseProtocolCachePolicy是直接从网络是获取
    /*
     其中缓存协议是个枚举类型包含:
     NSURLRequestUseProtocolCachePolicy(基础策略,直接从网络上拉取)

     NSURLRequestReloadIgnoringLocalCacheData(忽略本地缓存)

     NSURLRequestReturnCacheDataElseLoad(首先使用缓存,如果没有本地缓存,才从原地址下载)

     NSURLRequestReturnCacheDataDontLoad(使用本地缓存,从不下载,如果本地没有缓存,则请求失败,此策略多用于离线操作)

     NSURLRequestReloadIgnoringLocalAndRemoteCacheData(无视任何缓存策略,无论是本地的还是远程的,总是从原地址重新下载)

     NSURLRequestReloadRevalidatingCacheData(如果本地缓存是有效的则不下载,其他任何情况都从原地址重新下载)
     */
    //第三个参数是请求超时的时间,秒数
    NSURLRequest * request=[[NSURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:45];
    [NSURLConnection connectionWithRequest:request delegate:self];
    //发起请求
  //  NSURLConnection *connection = [[NSURLConnection alloc]initWithRequest:request delegate:self];
    //同步请求
   // NSData * data=[NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
   // NSLog(@"%@",data);
    NSLog(@"刷新UI");
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return _dataSource.count;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString * cellID=@"cell";
    UITableViewCell * cell=[tableView dequeueReusableCellWithIdentifier:cellID];
    if (cell==nil) {
        cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellID];
    }
    cell.textLabel.text=[_dataSource[indexPath.row]objectForKey:@"categoryname"];
    return cell;
}
//请求已经成功建立的时候会调用此方法
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    //NSURLResponse这是网络请求返回是响应体
    NSLog(@"111");
    //清空_mydata的数据
    [_muData setData:nil];
}
//服务器返回数据会调用此方法,这个会被多次调用,因为服务器一次返回的数据是有限制的,当此链接的资源过大或者过长,资源会被分为几次返回,因此data要拼接,当最后一次返回之后才是真正的完整的数据
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    NSLog(@"222");
    //拼接二进制流对象
    [_muData appendData:data];

}
//请求完成会调用此方法
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    [_tableView.header endRefreshing];
    [_tableView.footer endRefreshing];
    NSLog(@"333");
    [SVProgressHUD dismissWithSuccess:@"请求完成"];
    NSMutableDictionary * dic=[NSJSONSerialization JSONObjectWithData:_muData options:NSJSONReadingMutableContainers error:nil];
    NSLog(@"dic:%@",dic);
    NSArray * arr=[dic objectForKey:@"categorylist"];
    [_dataSource removeAllObjects];
    [_dataSource addObjectsFromArray:arr];
    //主线程刷新表格
    [_tableView reloadData];
}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


@end
资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 在 IT 领域,文档格式转换是常见需求,尤其在处理多种文件类型时。本文将聚焦于利用 Java 技术栈,尤其是 Apache POI 和 iTextPDF 库,实现 doc、xls(涵盖 Excel 2003 及 Excel 2007+)以及 txt、图片等格式文件向 PDF 的转换,并实现在线浏览功能。 先从 Apache POI 说起,它是一个强大的 Java 库,专注于处理 Microsoft Office 格式文件,比如 doc 和 xls。Apache POI 提供了 HSSF 和 XSSF 两个 API,其中 HSSF 用于读写老版本的 BIFF8 格式(Excel 97-2003),XSSF 则针对新的 XML 格式(Excel 2007+)。这两个 API 均具备读取和写入工作表、单元格、公式、样式等功能。读取 Excel 文件时,可通过创建 HSSFWorkbook 或 XSSFWorkbook 对象来打开相应格式的文件,进而遍历工作簿中的每个 Sheet,获取行和列数据。写入 Excel 文件时,创建新的 Workbook 对象,添加 Sheet、Row 和 Cell,即可构建新 Excel 文件。 再看 iTextPDF,它是一个用于生成和修改 PDF 文档的 Java 库,拥有丰富的 API。创建 PDF 文档时,借助 Document 对象,可定义页面尺寸、边距等属性来定制 PDF 外观。添加内容方面,可使用 Paragraph、List、Table 等元素将文本、列表和表格加入 PDF,图片可通过 Image 类加载插入。iTextPDF 支持多种字体和样式,可设置文本颜色、大小、样式等。此外,iTextPDF 的 TextRenderer 类能将 HTML、
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值