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(@"链接失败");
    }
}
时间: 2024-10-05 06:12:52

NSURLConnection和NSRunLoop的相关文章

网络总结

阅读目录 基本概念 HTTP通信 iOS中常用的HTTP请求方式 HTTP 实践 - NSURLConnection(了解即可) 简单登陆界面 解析JSON IOS中JSON解决方案 苹果自带的movie播放器 字典转模型框架 设计框架需要考虑的问题 解析XML XSXMLParser GDataXML 解决输出到控制台显示中文乱码的问题 小文件下载 大文件下载 解压缩 文件上传 获取MIMEType NSOutputStream NSURLConnection和NSRunLoop NSURLS

NSURLConnection和Runloop(面试)

(1)两种为NSURLConnection设置代理方式的区别 //第一种设置方式: //通过该方法设置代理,会自动的发送请求 // [[NSURLConnection alloc]initWithRequest:request delegate:self]; //第二种设置方式: //设置代理,startImmediately为NO的时候,该方法不会自动发送请求 NSURLConnection *connect = [[NSURLConnection alloc]initWithRequest:

iOS 8:【转】NSURLConnection 在页面滑动时继续执行

源地址:http://fann.im/blog/2013/09/20/nsurlconnection-in-scrolling/ 实际开发中用了 AFN 等是不会遇到这个问题.当然也可以作为原理理解. 首先是 NSRunLoop,我的理解 runloop 就是 iOS 的消息循环处理机制,响应处理各种消息事件.runloop 有不同的执行模式,不同模式下只会响应处理该模式类型的事件.App 运行时会有一个主线程 mainRunLoop,在程序中可以用 [NSRunloop currentRunL

Cocoa深入学习:NSOperationQueue、NSRunLoop和线程安全 (转)

目前在 iOS 和 OS X 中有两套先进的同步 API 可供我们使用:NSOperation 和 GCD .其中 GCD 是基于 C 的底层的 API ,而 NSOperation 则是 GCD 实现的 Objective-C API. 虽然 NSOperation 是基于 GCD 实现的, 但是并不意味着它是一个 GCD 的 “dumbed-down” 版本, 相反,我们可以用NSOperation 轻易的实现一些 GCD 要写大量代码的事情. 因此, NSOperationQueue 是被

【转】 NSURLProtocol和NSRunLoop的那些坑

转自:http://xiangwangfeng.com/2014/11/29/NSURLProtocol%E5%92%8CNSRunLoop%E7%9A%84%E9%82%A3%E4%BA%9B%E5%9D%91/ 参考:http://www.raywenderlich.com/59982/nsurlprotocol-tutorial 最近用AFNetworking替换掉了工程里的ASIHttpRequest,结果陆续碰到很多问题: 如何统一地添加全局的HTTP头(不仅仅是UA而已) 如何优雅地

NSRunLoop 详解

今天看到了NSRunloop,其实之前也有看了关于NSRunloop的内容,在这里想简单的就个人的理解总结一下.其实自己在开发的过程当中,还没有更多的涉及到NSRunloop的功能.总的来说,NSRunloop就是类似于windows的消息机制.他的存在是给线程增加事件处理机制. 对于多线程开发而言,有两种处理方案,一种是不需要太多的交互,直接运算比较大的数据内容就可以,另一种方法是将执行函数加入到消息循环当中去,等待事件的发生,然后执行. 有了NSRunloop,会使线程的表现变得更加的好,他

让NSURLConnection在子线程中运行

可以有两个办法让NSURLConnection在子线程中运行,即将NSURLConnection加入到run loop或者NSOperationQueue中去运行. 前面提到可以将NSTimer手动加入NSRunLoop,Cocoa库也为其它一些类提供了可以手动加入NSRunLoop的方法,这些类有NSPort.NSStream.NSURLConnection.NSNetServices,方法都是[scheduleInRunLoop:forMode:]形式.我暂时只介绍下最常用的NSURLCon

NSURLConnection和Runloop、AFN的基本使用

1.NSURLConnection和Runloop(面试) 1.1 涉及知识点 (1)两种为NSURLConnection设置代理方式的区别 //第一种设置方式: //通过该方法设置代理,会自动的发送请求 // [[NSURLConnection alloc]initWithRequest:request delegate:self]; //第二种设置方式: //设置代理,startImmediately为NO的时候,该方法不会自动发送请求 NSURLConnection *connect =

NSURLConnection笔记

使用NSURLConnection下载文件 发送请求的步骤: 1.设置url 2.设置request 3.发送请求,同步or异步 使用同步方法下载文件 在主线程调用同步方法,一直在等待服务器返回数据,代码会卡住,如果服务器,没有返回数据,那么在主线程UI会卡住不能继续执行操作.有返回值NSData //1.url NSString *urlstr = @"xxxx"; urlstr = [urlstr stringByAddingPercentEscapesUsingEncoding: