Get的同步以及异步

本文详细介绍了iOS开发中同步和异步网络请求的区别、实现方式及应用场景,包括请求构造、发送流程、同步与异步请求的区别以及如何正确处理响应和错误。

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

1.Get的同步请求

- (NSURLRequest *)getLoginRequest


{

    NSString *userName = _userName.text;

    NSString *password = [_password.text companyMD5];


    NSLog(@"%@", [_password.text MD5]);


    NSLog(@"%@", password);

    // 1. 网络地址URL


    NSString *urlString = [NSStringstringWithFormat:@"http://192.168.3.251/~apple/itcast/login.php?username=%@&password=%@", userName, password];


    urlString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

    NSURL *url = [NSURL URLWithString:urlString];

    // 2. 请求


    // 1> url


    // 2> 缓存策略


    // 3> 超时时长


    // 提示:因为网络的状态是未知的,因此要使用URLRequest一定要指定超时时长


    // 否则会严重影响用户体验!


    return [NSURLRequestrequestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicytimeoutInterval:2.0f];

15 
16 #pragma mark 同步登录请求
17 - (IBAction)syncLogin
18 {
19     // 1. 建立请求
20     NSURLRequest *request = [self getLoginRequest];
21     
22     // 在OC中,凡是看到__autoreleasing标示符的,表示参数需要传入地址,所谓地址就是添加“&”
23     NSURLResponse *response = nil;
24     NSError *error = nil;
25     
26     // 同步请求的应用场景:例如:网银账户的登录!
27     // 一定要获取到某个网络返回数据后,才能进行下一步操作的场景!
28     // 发送同步请求,respone&error要带地址的原因就是为了方法执行后,能够方便使用response&error
29     NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
30     
31     // 提示,上面的网络同步请求不完成,下面一句话是不会执行到的!
32     if (data != nil) {
33         // 网络请求正常
34         
35         // 将data转换为字符串
36         NSString *result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
37         
38         [self showMessageWithResult:result];
39     } else if (data == nil && error == nil) {
40         // 网络返回空数据
41         NSLog(@"接收到空数据");
42     } else {
43         NSLog(@"%@", error.localizedDescription);
44     }
45 }

 

2.Get的异步登陆方法

 1 - (NSURLRequest *)getLoginRequest
 2 {
 3     NSString *userName = _userName.text;
 4     NSString *password = [_password.text companyMD5];
 5     NSLog(@"%@", [_password.text MD5]);
 6     NSLog(@"%@", password);
 7     
 8     // 1. 网络地址URL
 9     NSString *urlString = [NSString stringWithFormat:@"http://192.168.3.251/~apple/itcast/login.php?username=%@&password=%@", userName, password];
10     urlString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
11     
12     NSURL *url = [NSURL URLWithString:urlString];
13     
14     // 2. 请求
15     // 1> url
16     // 2> 缓存策略
17     // 3> 超时时长
18     // 提示:因为网络的状态是未知的,因此要使用URLRequest一定要指定超时时长
19     // 否则会严重影响用户体验!
20     return [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:2.0f];
21    
22 }
23 
24 
25 - (IBAction)asyncLogin
26 {
27     // 1. request
28     NSURLRequest *request = [self getLoginRequest];
29     
30     // 异步登录
31     // 后台耗时的任务,与界面无关的操作会放在后台线程中执行。
32     NSOperationQueue *queue = [[NSOperationQueue alloc] init];
33     
34     [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
35         // 块代码的内容会在网络访问后执行
36         // 块代码是预先定义好的代码片段,在满足某个条件时执行的。
37         NSLog(@"%@", [NSThread currentThread]);
38         
39         if (data != nil) {
40             // 网络请求正常
41             
42             // 将data转换为字符串
43             NSString *result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
44             
45             [[NSOperationQueue mainQueue] addOperationWithBlock:^{
46                 [self showMessageWithResult:result];
47             }];
48         } else if (data == nil && connectionError == nil) {
49             // 网络返回空数据
50             NSLog(@"接收到空数据");
51         } else {
52             NSLog(@"%@", connectionError.localizedDescription);
53         }
54     }];
55     
56     NSLog(@"come here");
57 }

 

转载于:https://www.cnblogs.com/hkyangvip/p/3496686.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值