iOS開發之小檔案
阿新 • • 發佈:2019-02-19
如果檔案比較小,下載方式會比較多
1》直接用NSData的+(id)dataWithContentsOfURL:(NSURL*)url;
2》利用NSURLConnection傳送一個HTTP請求去下載
3》如果是下載圖片,還可以利用SDWebImage框架
**************我是一條分隔線**************
法一、NSData的+(id)dataWithContentsOfURL:(NSURL*)url
是一個耗時操作
法二、NSURLConnection的同步請求也是耗時操作,就不多說了。
NSURLConnection的非同步請求block方法有2個弊端:
1》無法監聽下載的進度
2》記憶體會飆升(下載下來的資料會佔據記憶體無法釋放)
法三、NSURLConnection的代理方法。代理雖然可以實現監聽到下載的進度,但是依然有一個弊端:
1》記憶體還是會飆升。
所以總結一下就是:NSURLConnection只合適下載小檔案2M以內,但是iOS9以後NSURLConnection也被蘋果棄用了。如果是大檔案下載,建議使用NSURLSession或者第三方框架。
**************我是一條分隔線**************
使用NSURLConnection傳送請求的步驟很簡單 1》建立一個NSURL物件,設定請求路徑 2》傳入NSURL建立一個NSURLRequest物件,設定請求頭和請求體 3》使用NSURLConnection傳送請求
**************我是一條分隔線**************
**************NSMutableURLRequest**************
使用NSURLConnection傳送請求的步驟很簡單 1》建立一個NSURL物件,設定請求路徑 2》傳入NSURL建立一個NSURLRequest物件,設定請求頭和請求體 3》使用NSURLConnection傳送請求
**************我是一條分隔線**************
NSURLConnection常見的傳送請求方法有以下幾種
同步請求
[NSURLConnection sendSynchronousRequest:<#(nonnull NSURLRequest *)#> returningResponse:<#(NSURLResponse *__autoreleasing _Nullable * _Nullable)#> error:<#(NSError * _Nullable __autoreleasing * _Nullable)#>];
非同步請求:根據對伺服器返回資料的處理方式的不同,又可以分為2種
block回撥
[NSURLConnection sendAsynchronousRequest:<#(nonnull NSURLRequest *)#> queue:<#(nonnull NSOperationQueue *)#> completionHandler:<#^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError)handler#>];
協議代理
+ (NSURLConnection*)connectionWithRequest:(NSURLRequest *)request delegate:(id)delegate;
- (id)initWithRequest:(NSURLRequest *)request delegate:(id)delegate;
- (id)initWithRequest:(NSURLRequest *)request delegate:(id)delegate startImmediately:(BOOL)startImmediately;
**************NSURLConnectionDelegate**************NSURLConnectionDataDelegate協議中的代理方法
開始接收到伺服器的響應時呼叫
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;
接收到伺服器返回的資料時呼叫(伺服器返回的資料比較大時會呼叫多次)
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;
伺服器返回的資料完全接收完畢後呼叫
- (void)connectionDidFinishLoading:(NSURLConnection *)connection;
請求出錯時呼叫(比如請求超時)
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;
**************NSMutableURLRequest**************
NSMutableURLRequest是NSURLRequest的子類,常用方法有
設定請求超時等待時間(超過這個時間就算超時,請求失敗)
- (void)setTimeoutInterval:(NSTimeInterval)seconds;
設定請求方法(比如GET和POST)
- (void)setHTTPMethod:(NSString *)method;
設定請求體
- (void)setHTTPBody:(NSData *)data;
設定請求頭
- (void)setValue:(NSString *)value forHTTPHeaderField:(NSString *)field;
**************建立GET和POST請求**************
建立GET請求
NSString *urlStr = [@"http://...?username=123&pwd=123" stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL *url = [NSURL URLWithString:urlStr];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
建立POST請求
NSString *urlStr = @"http://....";
NSURL *url = [NSURL URLWithString:urlStr];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
request.HTTPMethod = @"POST";
// 請求體
NSString *bodyStr = @"username=123&pwd=123";
request.HTTPBody = [bodyStr dataUsingEncoding:NSUTF8StringEncoding];