CFRunLoopRun监听到网络事件

问题:

默认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);
}

你可能感兴趣的:(CFRunLoopRun监听到网络事件)