zoukankan      html  css  js  c++  java
  • NSURLConnection和NSRunLoop


    主线程中创建一个NSURLConnection并异步运行

    [self performSelectorOnMainThread:@selector(start) withObject:nil waitUntilDone:YES];
    - (void)start
    {
        //step 1:请求地址
        NSURL *url = [NSURL URLWithString:@"www.2cto.com"];
        //step 2:实例化一个request
        NSURLRequest *request =[NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:30.0];
        //step 3:创建链接
        self.connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];//直接执行了
        if (self.connection) {
            NSLog(@"链接成功");
        }else {
            NSLog(@"链接失败");
        }
    }

    问题:
    当前线程是主线程
    创建的NSURLConnection实例执行在主线程。主线程有一个执行的runloop实例来支持NSURLConnection的异步执行,
    此时runloop的执行模式为NSDefaultRunLoopMode,这样的mode下,假设主线程执行拖动操作,runloop不处理NSURLConnection的回调事件。
    由于拖动操作发生过程中。使当前线程的runloop执行在UITrackingRunLoopMode模式下,这样的模式下的runloop会暂定处理其它事件(异步请求回调、timer事件等)。


    解决方法,改动代码为:

    [self performSelectorOnMainThread:@selector(start) withObject:nil waitUntilDone:YES];
    - (void)start
    {
        //step 1:请求地址
        NSURL *url = [NSURL URLWithString:@"www.2cto.com"];
        //step 2:实例化一个request
        NSURLRequest *request =[NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:30.0];
        //step 3:创建链接
        self.connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO];//临时不执行
        [connection scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];//用NSRunLoopCommonModes
        [connection start];    
        if (self.connection) {
            NSLog(@"链接成功");
        }else {
            NSLog(@"链接失败");
        }
    }
    





  • 相关阅读:
    MapReduce —— MapTask阶段源码分析(Output环节)
    MapReduce——移动数据不如移动计算
    MapReduce —— MapTask阶段源码分析(Input环节)
    MapReduce——客户端提交任务源码分析
    NameNode和SecondaryNameNode角色功能分析
    线程的实现原理
    RTFSC:SpringBoot 源码惊鸿一瞥
    垃圾收集器学习笔记
    常见的六种OOM异常和错误
    简单类型多线程加锁
  • 原文地址:https://www.cnblogs.com/claireyuancy/p/6916333.html
Copyright © 2011-2022 走看看