`
tank2308635
  • 浏览: 192050 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Iphone开发-NSRunLoop概述和原理

阅读更多

转自 cocoaChina:http://www.cocoachina.com/bbs/read.php?tid=73570&page=9

 

Iphone开发-NSRunLoop概述和原理
1.什么是NSRunLoop?
我们会经常看到这样的代码:


- (IBAction)start:(id)sender
{
pageStillLoading = YES;
[NSThread detachNewThreadSelector:@selector(loadPageInBackground:)toTarget:self withObject:nil];
[progress setHidden:NO];
while (pageStillLoading) {
[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
}
[progress setHidden:YES];
}

  这段代码很神奇的,因为他会“暂停”代码运行,而且程序运行不会因为这里有一个while循环而受到影响。在[progress setHidden:NO]执行之后,整个函数像暂停了一样,停在循环里面,等loadPageInBackground里面的操作都完成了以后,
才让[progress setHidden:YES]运行。这样做就显得简单,而且逻辑很清晰。如果不这样做,就需要在loadPageInBackground里面表示load完成的地方调用[progress setHidden:YES],显得代码不紧凑而且容易出错。
那么具体什么是NSRunLoop呢?其实NSRunLoop的本质是一个消息机制的处理模式。如果你对vc++编程有一定了解,在windows中,有一系列很重要的函数SendMessage,PostMessage,GetMessage,
这些都是有关消息传递处理的API。但是在你进入到Cocoa的编程世界里面,我不知道你是不是走的太快太匆忙而忽视了这个很重要的问题,Cocoa里面就没有提及到任何关于消息处理的API,
开发者从来也没有自己去关心过消息的传递过程,好像一切都是那么自然,像大自然一样自然?在Cocoa里面你再也不用去自己定义WM_COMMAD_XXX这样的宏来标识某个消息,
也不用在switch-case里面去对特定的消息做特别的处理。难道是Cocoa里面就没有了消息机制?答案是否定的,只是Apple在设计消息处理的时候采用了一个更加高明的模式,那就是RunLoop。

 

利用NSRunLoop阻塞NSOperation线程
使用NSOperationQueue简化多线程开发中介绍了多线程的开发,我这里主要介绍一下使用NSRunLoop阻塞线程。
主要使用在NStimer定时启用的任务或者异步获取数据的情况如socket获取网络数据,要阻塞线程,直到获取数据之后在释放线程。
下面是线程中没有使用NSRunLoop阻塞线程的代码和执行效果:
线程类:

#import <Foundation/Foundation.h> 
@interface MyTask : NSOperation {     

@end
#import "MyTask.h" 
@implementation MyTask 
-(void)main     
{      
    NSLog(@"开始线程=%@",self);      
    [NSTimer timerWithTimeInterval:2 target:self selector:@selector(hiandeTime:) userInfo:nil repeats:NO];      
}      
-(void)hiandeTime:(id)sender      
{      
    NSLog(@"执行了NSTimer");      
}      
-(void)dealloc      
{      
    NSLog(@"delloc mytask=%@",self);      
    [super dealloc];      

@end
线程添加到队列中:


- (void)viewDidLoad     
{      
    [super viewDidLoad];      
    NSOperationQueue *queue=[[NSOperationQueue alloc] init];      
    MyTask *myTask=[[[MyTask alloc] init] autorelease];      
    [queue addOperation:myTask];      
    MyTask *myTask1=[[[MyTask alloc] init] autorelease];      
    [queue addOperation:myTask1];      
    MyTask *myTask2=[[[MyTask alloc] init] autorelease];      
    [queue addOperation:myTask2];      
    [queue release];      
}

执行结果是:
2011-07-25 09:44:45.393 OperationDemo[20676:1803] 开始线程=<MyTask: 0x4b4dea0>   
2011-07-25 09:44:45.393 OperationDemo[20676:5d03] 开始线程=<MyTask: 0x4b50db0>    
2011-07-25 09:44:45.396 OperationDemo[20676:1803] 开始线程=<MyTask: 0x4b51070>    
2011-07-25 09:44:45.404 OperationDemo[20676:6303] delloc mytask=<MyTask: 0x4b4dea0>    
2011-07-25 09:44:45.404 OperationDemo[20676:5d03] delloc mytask=<MyTask: 0x4b50db0>    
2011-07-25 09:44:45.405 OperationDemo[20676:6303] delloc mytask=<MyTask: 0x4b51070>

可以看到,根本没有执行NSTimer中的方法,线程就释放掉了,我们要执行
NSTimer中的方法,就要利用NSRunLoop阻塞线程。下面是修改后的代码:

-(void)main     
{      
    NSLog(@"开始线程=%@",self);      
    NSTimer *timer=[NSTimer timerWithTimeInterval:2 target:self selector:@selector(hiandeTime) userInfo:nil repeats:NO];      
    [timer fire];      
    while (!didDisconnect) {      
        [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];      
    }      
}

执行结果如下:
2011-07-25 10:07:00.543 OperationDemo[21270:1803] 开始线程=<MyTask: 0x4d16380>     
2011-07-25 10:07:00.543 OperationDemo[21270:5d03] 开始线程=<MyTask: 0x4d17790>      
2011-07-25 10:07:00.550 OperationDemo[21270:6303] 开始线程=<MyTask: 0x4d17a50>      
2011-07-25 10:07:00.550 OperationDemo[21270:1803] 执行了NSTimer      
2011-07-25 10:07:00.551 OperationDemo[21270:5d03] 执行了NSTimer      
2011-07-25 10:07:00.552 OperationDemo[21270:6303] 执行了NSTimer      
2011-07-25 10:07:00.556 OperationDemo[21270:6503] delloc mytask=<MyTask: 0x4d16380>      
2011-07-25 10:07:00.557 OperationDemo[21270:6303] delloc mytask=<MyTask: 0x4d17790>      
2011-07-25 10:07:00.557 OperationDemo[21270:5d03] delloc mytask=<MyTask: 0x4d17a50>

我们可以使用NSRunLoop进行线程阻塞。

分享到:
评论

相关推荐

    LightWeightRunLoop-A-Reactor-Style-NSRunLoop, NSRunLoop反应器样式实现.zip

    LightWeightRunLoop-A-Reactor-Style-NSRunLoop, NSRunLoop反应器样式实现 LightWeightRunLoop在其他线程,定时器,URLConnection,LWStream ( LWInputStream、LWOutputStream ),LWPort ( LWSocketPort ) 等上实现 ...

    ios 事件循环原理-runloop

    iOS 事件循环原理-Run Loop 在 iOS 开发中,事件循环机制扮演着至关重要的角色,其中 NSRunLoop 是一个核心组件...了解 NSRunLoop 的工作原理和实现机制可以帮助开发者更好地使用这个组件,提高开发效率和代码质量。

    也来谈谈CFRunLoop(NSRunLoop)

    CFRunLoop(NSRunLoop)是苹果操作系统中的核心组件,主要用于处理事件循环和线程调度,尤其在iOS和Mac OS X的应用程序开发中起着至关重要的作用。这篇文章将深入探讨这两个概念,以及它们在实际开发中的应用。 ...

    软件工程师-iPhone开发技巧URLScheme启动进程调试教程.docx

    除了iPhone开发技巧外,本文还简要介绍了Excel表格的一些基本操作和快捷键。例如,取消隐藏选定范围内所有隐藏的行和列,应用不同的数字格式(如常规、货币、指数等),以及一些高效快捷的操作如利用Ctrl键加上括号...

    iphone开发

    在iPhone开发中,新手开发者需要掌握一系列关键技术点才能成功地构建和运行应用程序。本文将深入讲解几个关键概念,包括屏幕截图、图形绘制、颜色和字体的使用,以及延时函数和定时器的应用。 首先,实现屏幕截图是...

    NSRunLoopDemo

    综上所述,`NSRunLoopDemo`提供了丰富的示例,帮助开发者深入理解`NSRunLoop`的工作原理及其在实际开发中的应用。通过学习这个项目,你可以掌握如何有效地使用`NSRunLoop`来提升应用程序的性能和用户体验。

    Cocoa基本原理指南

    Cocoa框架的组件可以分为运行环境和开发环境两个方面。运行环境方面,Cocoa应用程序通过Aqua用户界面与操作系统集成,用户几乎感受不到Cocoa应用程序与其他操作系统组件的界限。开发环境方面,Cocoa框架提供了一整套...

    RunLoop例子

    Run Loop的配置和管理可以通过Objective-C的CFRunLoopRef(Core Foundation层)和NSRunLoop(Foundation层)进行。开发者可以通过添加源(Sources)、观察者(Observers)和端口(Ports)来定制Run Loop的行为,例如...

    swift-使用swift通过14个迷你项目来助推macOS开发

    在Swift编程语言的世界里,开发macOS应用程序是一个充满乐趣和挑战的过程。本教程将通过14个迷你项目,深入浅出地教你如何利用Swift来提升macOS开发技能。每个项目都将涵盖不同的技术点,帮助你逐步掌握macOS应用...

    Foundation Framework Reference&iphone Foundation框架参考

    "iphone Foundation框架参考"表明这个文档是针对iPhone(也包括iPad等iOS设备)开发者的,旨在帮助他们在开发过程中理解和使用Foundation框架。 描述中提到,这是一个本地化的资源,开发者可以在没有网络的情况下...

    IOS面试题总结,集合了很多培训机构的老师精心整理出来的,绝对给力

    这份"iOS面试题总结"涵盖了iOS开发的核心技术和实践,对于求职者来说,理解和掌握这些知识点将大大增加面试成功的机会。无论你是初学者还是有经验的开发者,都应该深入学习,确保自己在竞争激烈的iOS开发者市场中...

    objective-c实现socket的几个Demo

    本篇文章将深入探讨Objective-C如何实现Socket编程,并结合iPhone和Mac平台的示例进行详细讲解。 首先,Socket是网络编程中的一个接口,它提供了一种在不同计算机之间建立连接并交换数据的方式。在Objective-C中,...

    7.多线程篇1

    在iOS开发中,多线程技术是不可或缺的一部分,它使得应用程序可以同时执行多个任务,提高程序的响应速度和用户体验。本文将深入探讨Cocoa中的NSRunLoop、Run Loop管理、线程同步与通信以及线程调度等相关知识点。 1...

    iOS 开发 之 多线程总结

    iOS开发中的多线程技术是提升应用性能和用户体验的关键,特别是在处理耗时操作时,如网络请求、数据计算或大文件上传。本文将对多线程进行深入总结,主要涵盖线程的基本概念、使用多线程的原因以及在iPhone平台上...

    RunLoop示例

    在iOS和macOS开发中,`NSRunLoop`是苹果操作系统中的一个核心组件,它负责处理应用程序的事件循环,保持程序的运行并响应用户输入。`NSRunLoop`与`NSThread`和`Dispatch Queue`紧密相关,它们都是Apple的多线程编程...

    叶孤城】iOS进阶指南

    根据给定的信息,我们可以整理出一系列与iOS开发相关的高级知识点,包括UI设计、动画处理、网络请求、多线程管理等方面。以下是对这些知识点的详细解释: ### UI设计 #### UITableView - **基础概念**:...

    Objective-C高级编程 iOS与OS X多线程和内存管理

    本书重点聚焦于多线程和内存管理两个关键领域,对于iOS和macOS应用开发人员来说,这是理解和优化应用程序性能不可或缺的知识。 在Objective-C中,内存管理是通过引用计数(Reference Counting)和自动引用计数...

    iOS多线程编程指南(中文版)

    在iOS开发中,多线程能够充分利用设备的多核处理器能力,提高应用响应速度和整体性能。 **1.2 线程术语** - **线程**:执行流程的基本单元。 - **进程**:包含多个线程的独立执行环境。 - **并发**:指同一时间内...

    LearningCocoa4thEd-master.zip

    《Learning Cocoa 4th Ed》是Cocoa编程的经典教程,主要针对使用Objective-C进行iOS和macOS应用开发的初学者。这个"LearningCocoa4thEd-master.zip"压缩包包含了该书第四版的所有源码,旨在帮助读者通过实践加深对...

Global site tag (gtag.js) - Google Analytics