ios自带同步/异步请求数据

本文介绍了iOS开发中同步与异步网络请求的区别及其实现方法。同步请求会阻塞主线程直到请求完成,而异步请求则允许主线程继续执行其他任务。文章通过具体的示例代码展示了使用NSURLConnection和NSURLSession进行网络请求的具体步骤。

同步请求数据

同步请求会停止阻塞主线程,等待请求的服务器返回数据,处理后才会接着执行下面的程序


同步请求示例代码如下

- (void)synsRequestWithConnection
{
    //URL 地址
    NSString *path = [NSString stringWithFormat: @"http://10.0.8.8/sns/my/user_list.php?page=%d&number=%d",1,20];

    //字符串转换Url
    NSURL * url = [NSURL URLWithString:path];

    //设置url请求
    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    //同步请求
    NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

    //解析数据
    NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];

    NSLog(@"dict = %@",dict.description);

}

异步请求

异步请求不会阻塞主线程,向服务器发送请求之后,主线程可以继续做其他事情,而不必等待请求完成,请求完成后会返回一个反馈信息,通知相应的代理方法处理数据。

异步请求方式1,NSURLConnection请求,连接类, 和服务器建立连接并用来接收服务器的数据,注意,它内部会开辟一个新的线程和服务器交互,所以界面不会卡,不影响主线程代码的执行,此方法ios之前使用较多,具体代码如下:

- (void)asynsRequestWithConnection
{
    //URL 地址
    NSString *path = [NSString stringWithFormat: @"http://10.0.8.8/sns/my/user_list.php?page=%d&number=%d",1,20];

    //字符串转换Url
    NSURL * url = [NSURL URLWithString:path];

    //设置url请求
    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    //创建URLConnection对象
    //使用代理
    NSURLConnection *connect = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES];
    [connect start];//yes的话,此方法可以省略

}

NSURLConnection代理方法
实现NSURLConnectionDataDelegate,NSURLConnectionDelegate代理
pragma mark - 代理方法
//请求失败

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    //请求失败,比如超时 time out
    NSLog(@"error = %@",error.localizedDescription);
}

//服务器应答

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    //服务器应答
    //http 协议
    NSHTTPURLResponse *respose = (id)response;
    //status code
    //200   请求成功
    //404   请求失败
    //400   客户端错误
    //500   服务器端错误

    NSLog(@"staus code = %ld",respose.statusCode);

    //对数据进行初始化
    _mydata = [NSMutableData data];
}

//服务器返回数据,如果数据较大则会频繁调用

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    //发送数据
    [_mydata appendData:data];
}

//请求结束,数据返回完成

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    //请求结束了
    //对数据进行解析
    NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:_mydata options:NSJSONReadingMutableContainers error:nil];

    NSLog(@"异步请求 dict = %@",dict);
}

NSURLSession类进行异步请求

NSURLSession异步请求是在iOS7之后使用的方法,是使用block方法对数据进行处理,现在使用较多,示例代码如下:

- (void)asynsRequestWithSession
{
    //URL 地址
    NSString *path = [NSString stringWithFormat: @"http://10.0.8.8/sns/my/user_list.php?page=%d&number=%d",1,20];

    //字符串转换Url
    NSURL * url = [NSURL URLWithString:path];

    //创建session类,单例
    NSURLSession *session = [NSURLSession sharedSession];

    //session 有三个task 1.DataTask 2.uploadTask 3.downloadTask
    NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:[NSURLRequest requestWithURL:url] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {

        NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];

        NSLog(@"session: dict = %@",dict);
    }];

    //开始异步请求
    [dataTask resume];
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值