美文网首页
NSURLConnection 异步调用的坑

NSURLConnection 异步调用的坑

作者: IreneWang1988 | 来源:发表于2016-04-12 10:05 被阅读0次

    NSURLConnection 放在主线程会被阻塞,体验很不好。

    一开始初始化的时候使用的是:

    NSURLRequest*request=[[NSURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:100.0];//设置缓存和超时

    NSURLConnection *connection =[[NSURLConnection alloc]initWithRequest:request delegate:self startImmediately:NO];

    [connection start];

    后来经过学习发现:首先,如果是直接调用NSURLConnection的initWithRequest:delegate:startImmediately:(第三个参数用YES,这个是designated initializer)或者方法initWithRequest:delegate:时,NSURLConnection会默认运行在NSDefaultRunLoopMode模式下,即使再使用scheduleInRunLoop:forMode:设置运行模式也没有用。如果NSURLConnection运行在NSDefaultRunLoopMode下,何为Run Loop的模式Mode,请参考这篇Blog), 这篇Blog提到NSDefaultRunLoopMode是Run Loop默认的运行模式,用于处理除了NSConnection对象的事件。 然而如果NSURLConnection是运行在NSDefaultRunLoopMode,而当前线程是主线程,并且UI上有类似滚动这样的操作,那么主线程的Run Loop会运行在UITrackingRunLoopMode下,就无法响应NSURLConnnection的回调。此时需要首先使用initWithRequest:delegate:startImmediately:(第三个参数为NO)生成NSURLConnection,再重新设置NSURLConnection的运行模式为NSRunLoopCommonModes,那么UI操作和回调的执行都将是非阻塞的,因为NSRunLoopCommonModes是一组run loop mode的集合,默认情况下包含了NSDefaultRunLoopMode和UITrackingRunLoopMode。

    NSURLRequest*request=[[NSURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:100.0];//设置缓存和超时

    NSURLConnection *connection =[[NSURLConnection alloc]initWithRequest:request delegate:self startImmediately:NO];

    [connection scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];

    [connection start];

    不会阻塞下载。

    相关文章

      网友评论

          本文标题:NSURLConnection 异步调用的坑

          本文链接:https://www.haomeiwen.com/subject/trailttx.html