IOS 同步请求和异步请求

来源:互联网 发布:Windows鼠标指针 编辑:程序博客网 时间:2024/05/21 16:54
下课了,坐下来静静的总结一下今天学的内容
首先是 同步请求和异步请求

同步请求,
使用主线程一次性获得所有请求数据,这就导致一个比较容易出现的问题
当请求的数据比较大时,就会出现卡顿现象,也就是阻塞主线程,这对于
用户体验来说不太好

异步请求
异步请求就是再创建一个线程,使用这个线程进行请求数据,逐步请求数据,
这样就可以不断获得数据然后进行界面更新,不至于造成卡顿现象


我们以请求一个URL链接来作为例子
 
 同步请求
//定义一个宏
#define kURL @"http://www.baidu.com"

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
    // Override point for customization after application launch.
    self.window.backgroundColor = [UIColor whiteColor];
   
    //创建URL
    NSURL *mURL = [NSURL URLWithString:kURL];
    
   //创建一个请求,最大请求时间为20秒
    NSURLRequest *requrst = [NSURLRequest requestWithURL:mURL cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:20];
    
    //同步请求返回的参数
    NSURLResponse *response = nil;
    NSError *error = nil;
    //建立连接,下载数据,同步请求
    NSData *data = [NSURLConnection sendSynchronousRequest:requrst returningResponse:&response error:&error];
    
    //打印服务器传回得数据
    NSLog(@"data = %@",data);
    //打印请求出错时的出错信息
    NSLog(@"error is %@",[error localizedDescription]);
 
    [self.window makeKeyAndVisible];
    return YES;
}


      
 下面看同样情况下异步请求
 首先得遵守协议 NSURLConnectionDataDelegate
 
 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
    // Override point for customization after application launch.
    self.window.backgroundColor = [UIColor whiteColor];
   
   //同样先生成一个URL
    NSURL  *pURL = [NSURL URLWithString:kURL];
    
    //创建一个请求
    NSURLRequest *Pequest = [NSURLRequest requestWithURL:pURL cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:20];
    //发起请求,通过委托模式回调
    [NSURLConnection connectionWithRequest:Pequest delegate:self];
    
    [self.window makeKeyAndVisible];
    return YES;
}


//下面就是实现协议中的方法了


#pragma 服务器开始响应
//服务器响应回调
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    NSLog(@"服务器响应");
    //创建一个空的data
    self.mData = [NSMutableData data];
    
}


//服务器返回数据 data为返回数据,注意这里不一定是一次性返回所有数据
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    NSLog(@"服务器返回数据");
    [self.mData appendData:data];
}


//数据接收完毕
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    NSLog(@"数据接收完毕");
    //打印收到的数据
    NSLog(@"data = %@",self.mData);
}


//数据失败所调用的方法
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    NSLog(@"数据接收失败,失败原因%@",[error localizedDescription]);
}


至此就是异步请求了,可一边接受数据一边用接受的数据更新界面信息,不至于必须要接受完数据
才能进行界面更新。


以上就是同步请求和异步请求


总结未完,转下篇关于对服务器的两种请求方法GET 和 POST

链接:http://blog.csdn.net/lc_obj/article/details/17604539        


写给自己    ——   LC


0 0
原创粉丝点击