網絡請求:網絡
NSURLConnection框架
發送同步請求:異步
nsurlconnection發送同步請求是阻塞式,會阻塞當前線程async
發送異步請求:oop
nsurlconnection發送異步請求底層是開啓子線程發送請求,回調默認是在主線程中回調,若是須要在子線程中回調能夠設置代理隊列setDelegateQueue:子線程隊列.atom
PS:請求大的響應數據時使用delegate方式更加適合url
NSURLConnection與NSRunLoopspa
#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(抽象類)
文件上傳:
文件解壓縮:
ZipArchive框架
小文件寫入:
NSData
大文件寫入
NSFileHandle
NSOutPutStream