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

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

问题:

当前线程是主线程

创建的NSURLConnection实例执行在主线程。主线程有一个执行的runloop实例来支持NSURLConnection的异步执行,

此时runloop的执行模式为NSDefaultRunLoopMode,这样的mode下,假设主线程执行拖动操作,runloop不处理NSURLConnection的回调事件。

由于拖动操作发生过程中。使当前线程的runloop执行在UITrackingRunLoopMode模式下,这样的模式下的runloop会暂定处理其它事件(异步请求回调、timer事件等)。

解决方法,改动代码为:

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

NSURLConnection和NSRunLoop的更多相关文章

  1. NSURLConnection从入门到放弃

    尽管NSURLConnection已经不建议使用了,iOS 7取而代之的是NSURLSession,但是本文依然打算剖析一下,其中一些思想还是值得学习一下,如果您不用NSURLConnection,并 ...

  2. iOS笔记059 - 网络总结

    网络 基本概念 客户端:client 服务器:server 请求:request 响应:response 过程 客户端 -> 发送请求 -> 服务器(连接数据库) 服务器 -> 发送 ...

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

    目前在 iOS 和 OS X 中有两套先进的同步 API 可供我们使用:NSOperation 和 GCD .其中 GCD 是基于 C 的底层的 API ,而 NSOperation 则是 GCD 实 ...

  4. NSURLConnection使用

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

  5. HTTP和GET/POST请求(NSURLConnection)

    网络编程 网络编程是一种实时更新应用数据的常用手段 网络编程是开发优秀网络应用的前提和基础 网络基本概念 客户端(就是手机或者ipad等手持设备上面的APP) 服务器(远程服务器-本地服务器) 请求( ...

  6. iOS NSURLConnection 和 dispatch_async 错误的使用方法,导致回调方法无法调用

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, ), ^{ NSMutableURLRequest ...

  7. iOS - NSURLConnection 网络请求

    前言 @interface NSURLConnection : NSObject class NSURLConnection : NSObject DEPRECATED: The NSURLConne ...

  8. 让NSURLConnection在子线程中运行

    可以有两个办法让NSURLConnection在子线程中运行,即将NSURLConnection加入到run loop或者NSOperationQueue中去运行. 前面提到可以将NSTimer手动加 ...

  9. iOS多线程的初步研究(五)-- 如何让NSURLConnection在子线程中运行

    可以有两个办法让NSURLConnection在子线程中运行,即将NSURLConnection加入到run loop或者NSOperationQueue中去运行. 前面提到可以将NSTimer手动加 ...

随机推荐

  1. C#-入门思维导图

    C#-入门思维导图 百度云盘 链接:http://pan.baidu.com/s/1jI5zMS2 密码:0ypc 如有错误,请告知我

  2. WinServer-授权规则

    授权规则: 使用谓词可以限制网站只能使用某一种请求 来自为知笔记(Wiz)

  3. angular-Scope

    Scope(作用域) 是应用在 HTML (视图) 和 JavaScript (控制器)之间的纽带. Scope 是一个对象,有可用的方法和属性. Scope 可应用在视图和控制器上. 当你在 Ang ...

  4. 小记 SqlHelper

    using System;using System.Collections.Generic;using System.Data;using System.Linq;using System.Web;u ...

  5. 闭包(closure)与协程共用时要注意的事情

    闭包是一种能够让你用非常舒服的方式来编程的小技巧,Go也支持闭包. 假设从来没有接触过闭包,想在一開始就弄懂什么是闭包(closure)是非常困难的,就像递归一样,直到你真正写过.用过它,你才干真正的 ...

  6. activity生命周期的onPause和onStop

    搞了这么长时间的android开发,却对一些基础的东西一直模棱两可...就比方这个onPause和onStop. 假设从一个界面,跳到还有一个界面,那么是调用哪个呢? 经过我的实验.搞清楚了.onPa ...

  7. oracle 下操作blob字段是否会产生大量redo

    操作blob字段是否会产生大量redo,答案是不会.以下来做一个实验,測试数据库版本号是11.2.0.1.0: --创建一张表做測试之用 create table test_blob (   id n ...

  8. D3D 线列 小样例

    画两条线 #pragma once #pragma comment(lib,"d3d9.lib") #pragma comment(lib,"d3dx9.lib" ...

  9. AspNet WebApi 中应用fo-dicom抛出异常:No codec registered for tranfer syntax:

    背景: 在做一个Dicom Web Service, 当中WADO-RS中须要解析TransferSyntax, 然后就用到了fo-dicom中的DicomFile.ChangeTransferSyn ...

  10. 集群版本升级——rolling upgrade在ES 单节点从 restart 到加入集群,大概要 100s 左右的时间。也就是说,这 100s 内,该节点上的所有分片都是 unassigned 状态

    集群版本升级 Elasticsearch 作为一个新兴项目,版本更新非常快.而且每次版本更新都或多或少带有一些重要的性能优化.稳定性提升等特性.可以说,ES 集群的版本升级,是目前 ES 运维必然要做 ...