问题:
默认NSURLConnection 是在主线程工作,指定了代理的工作队列之后,整个下载仍然是在主线程!!UI事件能够卡住下载!
解决:
* 将网络操作放在异步线程,异步的运行循环不启动,没有办法监听到网络事件!!
* 为了保证连接的正常工作,调用线程的RunLoop 必须运行在默认的运行循环模式下!!
* //CoreFoundation 框架 CFRunloop
CFRunLoopStop(r) 停止指定的RunLoop
CFRunLoopGetCurrent() 拿到当前的RunLoop
CFRunLoopRun(); 直接启动当前的运行循环
实例代码:
/** 下载线程的运行循环 */
1. @property(assign,nonatomic)CFRunLoopRef downloadRunloop;
2. NSURLConnection * conn = [NSURLConnection connectionWithRequest:request delegate:self];
//设置代理工作的操作队列
[conn setDelegateQueue:[[NSOperationQueue alloc]init]];
//4.启动连接
[conn start];
//5. 启动运行循环
//1.拿到当前线程的运行循环
self.downloadRunloop = CFRunLoopGetCurrent();
//2.启动运行循环
CFRunLoopRun();
3. 所有的数据加载完毕 - 所有数据都传输完毕,只是一个最后的通知
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
NSLog(@"完毕 %@",[NSThread currentThread]);
//关闭文件流
[self.fileStream close];
//停止下载线程所在的运行循环
CFRunLoopStop(self.downloadRunloop);
}
网友评论