博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何让NSURLConnection在子线程中运行
阅读量:7236 次
发布时间:2019-06-29

本文共 1630 字,大约阅读时间需要 5 分钟。

可以有两个办法让NSURLConnection在子线程中运行,即将NSURLConnection加入到run loop或者NSOperationQueue中去运行。

前面提到可以将NSTimer手动加入NSRunLoop,Cocoa库也为其它一些类提供了可以手动加入NSRunLoop的方法,这些类有NSPort、NSStream、NSURLConnection、NSNetServices,方法都是[scheduleInRunLoop:forMode:]形式。我暂时只介绍下最常用的NSURLConnection类,看看如何把NSURLConnection的网络下载加入到其它线程的run loop去运行。

如果NSURLConnection是在主线程中启动的,实际上它就在主线程中运行 -- 并非启动的另外的线程,但又具备异步运行的特性,这个确实是run loop的巧妙所在。如果对run loop有了初步的了解和概念后,实际上就能明白NSURLConnection的运行,实际也是需要当前线程具备run loop。

- (void)scheduleInRunLoop:(NSRunLoop *)aRunLoop forMode:(NSString *)mode; //将加入指定的run loop中运行,必须保证这时NSURLConnection不能启动,否则不起作用了

- (void)unscheduleFromRunLoop:(NSRunLoop *)aRunLoop forMode:(NSString *)mode; //将取消在指定run loop中的运行,实际上就会停止NSURLConnection的运行

下面是如何在其它线程中运行NSURLConnection的主要实现代码:

NSRunLoop *runloop; //global

[self performSelectorInBackground:@selector(thread) withObject:nil]; //启动包含run loop的线程

NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO]; //注意这时不能先启动NSURLConnection

[conn scheduleInRunLoop:runloop forMode:NSRunLoopCommonModes]; //指定在上面启动的线程中运行NSURLConnection

[conn start]; //启动NSURLConnection

- (void)thread

{

  runloop = [NSRunLoop currentRunLoop]; //设置为当前线程的run loop值

  while (condition)

  {

    [runloop runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1.0]]; //启动run loop

  }

}

 

将NSURLConnection加入到NSOperationQueue中去运行的方式基本类似:

NSOperationQueue *queue = [[NSOperationQueueallocinit];

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

[conn setDelegateQueue:queue];

[conn start];

转载于:https://www.cnblogs.com/ritian/p/5291148.html

你可能感兴趣的文章
机器学习的入门逻辑回归
查看>>
“看脸”看不出花,但人工智能可以“看”出性格
查看>>
有了这四个“最”,AI或许可以成功预测地震
查看>>
三角阵
查看>>
Delphi2010中字符串汇编需要注意的一点,以及支持2010的AES加密库
查看>>
ExtJs 修改组件值方式
查看>>
mysql如收集统计信息
查看>>
同步和异步消息机制
查看>>
java nio
查看>>
Win10中文语言包安装方法
查看>>
Spring.NET的AOP怎么玩
查看>>
asp.net core mvc实现伪静态功能asp.net core mvc实现伪静态功能
查看>>
DirectX11中Shader的封装
查看>>
编写一个程序统计输入字符串中:各个数字,空白字符,以及其他所有字符常出现的次数。...
查看>>
移动互联网时代,如何颠覆式协同工作
查看>>
背水一战 Windows 10 (82) - 用户和账号: 获取用户的信息, 获取用户的同意
查看>>
discuz X3全局变量$_G
查看>>
Linux中更改转移mysql数据库目录的步骤
查看>>
AngularJs-04-模拟登陆
查看>>
Ubuntu安装ping工具
查看>>