問(wèn)題:
默認(rèn)NSURLConnection 是在主線程工作,指定了代理的工作隊(duì)列之后,整個(gè)下載仍然是在主線程!!UI事件能夠卡住下載!
解決:
* 將網(wǎng)絡(luò)操作放在異步線程,異步的運(yùn)行循環(huán)不啟動(dòng),沒(méi)有辦法監(jiān)聽到網(wǎng)絡(luò)事件!!
* 為了保證連接的正常工作,調(diào)用線程的RunLoop 必須運(yùn)行在默認(rèn)的運(yùn)行循環(huán)模式下!!
* //CoreFoundation 框架 CFRunloop
CFRunLoopStop(r) 停止指定的RunLoop
CFRunLoopGetCurrent() 拿到當(dāng)前的RunLoop
CFRunLoopRun(); 直接啟動(dòng)當(dāng)前的運(yùn)行循環(huán)
實(shí)例代碼:
/** 下載線程的運(yùn)行循環(huán) */
1. @property(assign,nonatomic)CFRunLoopRef downloadRunloop;
2. NSURLConnection * conn = [NSURLConnection connectionWithRequest:request delegate:self];
//設(shè)置代理工作的操作隊(duì)列
[conn setDelegateQueue:[[NSOperationQueue alloc]init]];
//4.啟動(dòng)連接
[conn start];
//5. 啟動(dòng)運(yùn)行循環(huán)
//1.拿到當(dāng)前線程的運(yùn)行循環(huán)
self.downloadRunloop = CFRunLoopGetCurrent();
//2.啟動(dòng)運(yùn)行循環(huán)
CFRunLoopRun();
3. 所有的數(shù)據(jù)加載完畢 - 所有數(shù)據(jù)都傳輸完畢,只是一個(gè)最后的通知
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
NSLog(@"完畢 %@",[NSThread currentThread]);
//關(guān)閉文件流
[self.fileStream close];
//停止下載線程所在的運(yùn)行循環(huán)
CFRunLoopStop(self.downloadRunloop);
}