IOS 同步請求和非同步請求

來源:互聯網
上載者:User

下課了,坐下來靜靜的總結一下今天學的內容
首先是 同步請求和非同步請求

同步請求,
使用主線程一次性獲得所有請求資料,這就導致一個比較容易出現的問題
當請求的資料比較大時,就會出現卡頓現象,也就是阻塞主線程,這對於
使用者體驗來說不太好

非同步請求
非同步請求就是再建立一個線程,使用這個線程進行請求資料,逐步請求資料,
這樣就可以不斷獲得資料然後進行介面更新,不至於造成卡頓現象


我們以請求一個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


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.