网络请求

直接上代码:

//
//  TableViewController.m
//
//

#import "TableViewController.h"

@interface TableViewController ()<NSURLConnectionDataDelegate>

@property (nonatomic, retain) NSMutableData *receivedData ; // 可变的二进制字节流属性,用于保存服务器传输的数据。
@property (nonatomic, retain) UIImageView *imageView ;

@end

@implementation TableViewController

- (void)dealloc {
    [_receivedData release];
    [_imageView release];
    [super dealloc];
}

- (NSMutableData *)receivedData {
    if (!_receivedData) {
        self.receivedData = [NSMutableData data];
    }
    return _receivedData;
}

- (UIImageView *)imageView {
    if (!_imageView) {
        self.imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 300, 200)];
        _imageView.center = self.view.center;
        [self.view addSubview:_imageView];
    }
    return _imageView;
}

- (void)viewDidLoad {
    [super viewDidLoad];

    //1、将网址字符串转成 NSURL 对象,注意:网址需要前缀,例如:http://  ftp://  https://
//    NSURL *url = [NSURL URLWithString:@"http://m2.qiushibaike.com/article/list/text?count=3&page=1&AdID=14314020462881C8509990"];
    NSURL *url = [NSURL URLWithString:@"http://project.lanou3g.com/teacher/duke/getAndPostRequest.php"];
    NSLog( @"%@", url );
    //文件 URL ,在创建URL 对象时需要提供文件路径字符串,该 URL 会自动为文件路劲添加 file:// 前缀
//    NSURL *fileUrl = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"beutifuly" ofType:@"jpg"]];
//    NSLog( @"%@", fileUrl );
    //2、根据指定的 NSURL 对象创建 NSURLRequest 请求对象
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    // 可变的请求对象
    NSMutableURLRequest *mutableRequest = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:60];
    //如果是 Post 请求的话需要通过子类 mutableRequest 去建立请求
    // 设置请求方式为 POST , 默认问 GET
    mutableRequest.HTTPMethod = @"POST";
    mutableRequest.HTTPBody = [@"param=logo.png" dataUsingEncoding:NSUTF8StringEncoding];

//    NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self];
    NSURLConnection *connection = [NSURLConnection connectionWithRequest:mutableRequest delegate:self];

    NSURLResponse *response = nil;
    NSError *error = nil;

    NSData *receivedData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

//    NSLog( @"%@", response ) ;
//    NSLog( @"%@", error );
    // 同步链接一旦建立,只有完成数据传输或者出现错误才可结束,否则主线程会一直等待数据传输完成,很容易出现用户操作没法得到主线程响应卡死的状态,在大量数据传输中,不要使用同步连接请求
    //异步链接请求会再建立链接时开辟子线程并将其加入到操作队列中,如果服务器端做出相应 block 中的参数 response 就是对应的响应对象,如果数据下载完成,data 就是对应的数据,如果出现错误,那么错误信息保存在 error 中,异步又称为不同步,表示主线程在运作期间如果遇到网络请求,则开辟子线程加载数据,子线程在完成数据传输后,通过 block 的形式将数据传递给主线程,主线程解析显示。
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
        NSString *content = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease];
//        NSLog( @"%@", content );

        NSArray *items = [[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil] objectForKey:@"items"];
//        NSLog( @"%@", items ) ;
    }];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    NSLog( @"链接请求得到服务器端响应%s", __FUNCTION__ ) ;
    NSLog( @"%@", response ) ;
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    NSLog( @"持续得到服务器端传输的数据包%s", __FUNCTION__ ) ;
//    NSLog( @"%@", data ) ;
    //凭借数据
    [self.receivedData appendData:data];
    NSLog( @"%ld", self.receivedData.length );

//    NSLog( @"%@", [[NSString alloc] initWithData:self.receivedData encoding:NSUTF8StringEncoding] ) ;
//
//    NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:self.receivedData options:NSJSONReadingMutableContainers error:nil];
//    NSLog( @"%@", dict );

    /// 把 imageView 为全局变量,慢慢显示出整张图片。
    UIImage *image = [UIImage imageWithData:self.receivedData];
    self.imageView.image = image ;

}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    NSLog( @"数据包传输完成%s", __FUNCTION__ ) ;
//    UIImage *image = [UIImage imageWithData:self.receivedData];
//    UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 300, 200)];
//    imageView.image = image ;
//    imageView.center = self.view.center;
//    [self.view addSubview:imageView];
//    [imageView release];
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    NSLog( @"数据传输失败,产生错误%s", __FUNCTION__ ) ;
}


#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 0;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return 0;
}

/*
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:<#@"reuseIdentifier"#> forIndexPath:indexPath];

    // Configure the cell...

    return cell;
}
*/

/*
// Override to support conditional editing of the table view.
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
    // Return NO if you do not want the specified item to be editable.
    return YES;
}
*/

/*
// Override to support editing the table view.
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        // Delete the row from the data source
        [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
    } else if (editingStyle == UITableViewCellEditingStyleInsert) {
        // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
    }  
}
*/

/*
// Override to support rearranging the table view.
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath {
}
*/

/*
// Override to support conditional rearranging of the table view.
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath {
    // Return NO if you do not want the item to be re-orderable.
    return YES;
}
*/

/*
#pragma mark - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    // Get the new view controller using [segue destinationViewController].
    // Pass the selected object to the new view controller.
}
*/

@end
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值