在使用NSURLConnection 时异步请求的坑 以及NSRunLoop 强制停止

  • 在使用NSURLConnection 时异步请求的坑
    • 当我们使用子线程创建NSURLConnection异步请求时发现请求无响应 ?
    • 我们需要开启子线程的NSRunLoop
    • 如下
dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSURLConnection *conn = [NSURLConnection connectionWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://120.25.226.186:32812/resources/images/minion_01.png"]] delegate:self];
        // 决定代理方法在哪个队列中执行
        [conn setDelegateQueue:[[NSOperationQueue alloc] init]];
        
        // 启动子线程的runLoop
//        [[NSRunLoop currentRunLoop] run];
        
        self.runLoop = CFRunLoopGetCurrent();
        
        // 启动runLoop
        CFRunLoopRun();
    });
  • 如何取消NSRunLoop
    • 当我们想强制取消NSRunLoop时 需创建CFRunLoopRef 对应 CFRunLoopStop(self.runLoop) 停止RunLoop
  • 代码
#import "ViewController.h"

@interface ViewController () <NSURLConnectionDataDelegate>
/** runLoop */
@property (nonatomic, assign) CFRunLoopRef runLoop;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSURLConnection *conn = [NSURLConnection connectionWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://120.25.226.186:32812/resources/images/minion_01.png"]] delegate:self];
        // 决定代理方法在哪个队列中执行
        [conn setDelegateQueue:[[NSOperationQueue alloc] init]];
        
        // 启动子线程的runLoop
//        [[NSRunLoop currentRunLoop] run];
        
        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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 这是AF2.x经典的代码: 首先我们要明确一个概念,线程一般都是一次执行完任务,就销毁了。 而添加了runloop...
    有梦想的老伯伯阅读 6,089评论 5 13
  • 什么是Run Loops RunLoops是与线程相关联的基础部分,一个Run Loop就是事件处理循环,他是用来...
    傻傻小萝卜阅读 4,643评论 0 5
  • 首先看一段AF2.x经典代码: 首先我们要明确一个概念,线程一般都是一次执行完任务,就销毁了。 而添加了runlo...
    涂耀辉阅读 22,783评论 42 293
  • 如果没有RunLoop main函数中的RunLoop 第14行代码的UIApplicationMain函数内部就...
    JonesCxy阅读 3,663评论 0 4
  • 那一天,我没有自己的想法 那一天,朋友牵我如马 哦,还不如马 我眼角的泪延伸到了脚下 重重的倒下 那一次,我走了很...
    小渔阅读 1,441评论 1 1

友情链接更多精彩内容