網絡請求:
NSURLConnection
發送同步請求:
nsurlconnection發送同步請求是阻塞式,會阻塞當前線程
發送異步請求:
nsurlconnection發送異步請求底層是開啟子線程發送請求,回調默認是在主線程中回調,如果需要在子線程中回調可以設置代理隊列setDelegateQueue:子線程隊列.
PS:請求大的響應數據時使用delegate方式更加適合
NSURLConnection與NSRunLoop
#import "ViewController.h"
@interface ViewController () <NSURLConnectionDataDelegate>
/** runLoop */
@property (nonatomic, assign) CFRunLoopRef runLoop;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 如果在子線程中使用NSURLConnection發送請求是不會有效果,因為子線程的runloop沒有啟動,子線程runloop默認是不啟動的
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSURLConnection *conn = [NSURLConnection connectionWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.baidu.com/images/234234324limgAB/2342lkjasdf3kkkkk.jpg"]] delegate:self];
// 決定代理方法在哪個隊列中執行
[conn setDelegateQueue:[[NSOperationQueue alloc] init]];
// 啟動子線程的runLoop
// [[NSRunLoop currentRunLoop] run];
// 保存當前runloop
self.runLoop = CFRunLoopGetCurrent();
// 啟動runLoop
CFRunLoopRun();
});
}
#pragma mark - <NSURLConnectionDataDelegate>
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
NSLog(@"didReceiveResponse******%@", [NSThread currentThread]);
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
NSLog(@"didReceiveData******%@", [NSThread currentThread]);
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
NSLog(@"connectionDidFinishLoading******%@", [NSThread currentThread]);
// 停止RunLoop
CFRunLoopStop(self.runLoop);
}
@end
NSURLSession
使用NSURLSession 對象創建Task,然后執行Task
Task的類型: NSURLSessionTask抽象類, 派生出子類有NSURLSessionDataTask,NSURLSesssionDownloadTask,NSURLSessionDataTask又派生出NSURLSessionUploadTask
NSURLSessionTask(抽象類)
- NSURLSessionDataTask
- NSURLSessionUploadTask
- NSURLSessionDownloadTask
文件上傳:
文件解壓縮:
ZipArchive框架
小文件寫入:
NSData
大文件寫入
NSFileHandle
NSOutPutStream
浙公網安備 33010602011771號