一. 兩種為NSURLConnection設(shè)置代理方法的區(qū)別
第一種設(shè)置:
//通過該方法設(shè)置代理,會自動的發(fā)送請求
[[NSURLConnection alloc]initWithRequest:request delegate:self];
第二種設(shè)置
//設(shè)置代理,startImmediately為NO的時候,該方法不會自動發(fā)送請求
NSURLConnection *connect = [[NSURLConnection alloc]initWithRequest:request delegate:self startImmediately:NO];
//手動通過代碼的方式發(fā)送請求
//方法內(nèi)部會自動把connect添加到當前線程的Runloop中的默認模式下執(zhí)行
[connect start];
二 如何控制代理方法在哪個線程調(diào)用
//默認情況下,代理方法會主線程中進行 調(diào)用(為了方便開發(fā)者拿到數(shù)據(jù)后處理一些刷新UI的操作不需要考慮線程通信)
//設(shè)置代理方法的執(zhí)行列隊
[connect setDelegateQueue:[[NSOperationQueue alloc]init];
三. 開子線程發(fā)送網(wǎng)絡(luò)請求的注意點 適用于自動發(fā)送網(wǎng)絡(luò)請求模式
//在子線程中發(fā)送網(wǎng)絡(luò)請求 _調(diào)用startf方法發(fā)送
-(void)createNewThreadSendConnect1
{
//1創(chuàng)建一個非主隊列
NSOperationQueue *queue = [NSOperationQueue alloc]init];
//2.封裝操作,并把任務(wù)添加到隊列中執(zhí)行
[queue addOperationWithBlock:^{
NSLog(@"%@",[NSThread currentThread]);
//2.1.確定請求路徑
NSURL *url = [NSURL URLWithString:@"路徑URL地址"];
//2.2創(chuàng)建請求對象
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//2.3使用NSURLConnection設(shè)置代理,發(fā)送網(wǎng)絡(luò)請求
NSURLConnection *connection = [NSURLConnection alloc]initWithRequest:request delegate:self startImmediately:YES];
//2.4.設(shè)置代理方法在哪個隊列中執(zhí)行 ,如果是非主隊列,那么代理方法將再子線程中執(zhí)行
[connection setDelegate Queue:[[NSOperationQueue alloc]init]];
//2.5.發(fā)送網(wǎng)絡(luò)請求
//start 方法內(nèi)部會把當前的connect對象作為一個source添加到當前線程對應(yīng)的runloop中
//區(qū)別在于,如果調(diào)用start方法開發(fā)送網(wǎng)絡(luò)請求,那么在添加到source的過程中,如果當前runloop不存在. 那么該方法內(nèi)部會自動創(chuàng)建一個當前線程對應(yīng)的runloop,并啟動.
[connection start];
}];
}
-
在子線程中發(fā)送網(wǎng)絡(luò)請求 自動發(fā)送網(wǎng)絡(luò)請求
-(void)createNewThreadSendConnect2 { NSLog(@"------"); //1創(chuàng)建一個非主列隊 NSOperationQueue *queue = [NSOperationQueue alloc]init]; //封裝操作,并把任務(wù)添加到隊列中執(zhí)行 [queue addOperationWithBlock:^{ //2.1 確定請求路徑 NSURL *url = [NSURL URLWithString@"路徑"]; //2.2創(chuàng)建請求對象 NSURLRequest *request = [NSURLRequest requestWithURL:url]; //2.3使用NSURLConnection設(shè)置代理,發(fā)送網(wǎng)絡(luò)請求 //注意:該方法內(nèi)部雖然會把connection添加到runloop,但是如果當前的runloop不存在,那么不會主動創(chuàng)建 NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self]; //2.4設(shè)置代理方法在哪個隊列中執(zhí)行,如果是非主隊列,那么代理方法將在子線程中執(zhí)行 [connection setDelegateQueue:[[NSOperationQueue alloc]init]; //2.5 創(chuàng)建當前線程對應(yīng)的runloop,并開啟 [[NSRunloop currentRunloop]run]; }]; }
純手動 有地方是個人理解 有誤的地方希望大家能給指出 謝謝
如果對您有幫助 希望能給個關(guān)注和喜歡~~~