ioS开发之UI基础--NSRunLoop了解
来源:互联网 发布:市场调研数据分析 编辑:程序博客网 时间:2024/05/16 09:15
NSRunLoop
一.NSRunLoop
在Cocoa中,每个线程(NSThread)对象中内部都有一个run loop(NSRunLoop)对象用来循环处理输入事件,处理的事件包括两类,一是来自Input sources的异步事件,一是来自Timer sources的同步事件;
run Loop在处理输入事件时会产生通知,可以通过Core Foundation向线程中添加run-loopobservers来监听特定事件,以在监听的事件发生时做附加的处理工作。
每个run loop可运行在不同的模式下,一个run loop mode是一个集合,其中包含其监听的若干输 入事件源,定时器,以及在事件发生时需要通知的run loop observers。运行在一种mode下的run loop只会处理其run loop mode中包含的输入源事件,定时器事件,以及通知run loopmode中包 含的observers。
Cocoa中的预定义模式有:
Default模式
定义:NSDefaultRunLoopMode (Cocoa) kCFRunLoopDefaultMode(Core Foundation) 描述:默认模式中几乎包含了所有输入源(NSConnection除外),一般情况下应使用此模式。Connection模式
定义:NSConnectionReplyMode(Cocoa) 描述:处理NSConnection对象相关事件,系统内部使用,用户基本不会使用。Modal模式 定义:NSModalPanelRunLoopMode(Cocoa) 描述:处理modal panels事件。
Event tracking模式
定义:UITrackingRunLoopMode(iOS) NSEventTrackingRunLoopMode(cocoa) 描述:在拖动loop或其他user interface tracking loops时处于此种模式下,在此模式下 会限制输入事件的处理。例如,当手指按住UITableView拖动时就会处于此模式。
Common模式
定义:NSRunLoopCommonModes (Cocoa) kCFRunLoopCommonModes(Core Foundation) 描述:这是一个伪模式,其为一组run loop mode的集合,将输入源加入此模式意味着在Common Modes中包含的所有模式下都可以处理。在Cocoa应用程序中,默认情况下CommonModes包含default modes,modal modes,event Tracking modes.可使用CFRunLoopAddCommonMode方法想Common Modes中添加自定义modes。获取当前线程的run loop mode
NSString* runLoopMode = [[NSRunLoop currentRunLoop] currentMode];二.NSTimer、NSURLConnection与UITrackingRunLoopModeNSTimer与NSURLConnection默认运行在default mode下,这样当用户在拖动UITableView处于
UITrackingRunLoopMode模式时,NSTimer不能fire,NSURLConnection的数据也无法处理。
NSTimer的例子: 在一个UITableViewController中启动一个0.2s的循环定时器,在定时器到期时更新一个计数器,
并显示在label上。
<span style="font-size:18px;">-(void)viewDidLoad{label =[[[UILabel alloc]initWithFrame:CGRectMake(10, 100, 100, 50)]autorelease];[self.view addSubview:label];count = 0;NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval: 0.2 selector:@selector(incrementCounter:) userInfo: nil repeats: YES];@selector(incrementCounter:) userInfo: nil repeats: YES];}- (void)incrementCounter:(NSTimer *)theTimer{count++;label.text = [NSString stringWithFormat:@"%d",count];}</span>
在正常情况下,可看到每隔0.2s,label上显示的数字+1,但当你拖动或按住tableView时,label上的数字不再更新,当你手指离开时,label上的数字继续更新。当你拖动UItableView时,当前线程run loop处于UIEventTrackingRunLoopMode模式,在这种模式下,不处理定时器事件,即定时器无法fire,label上的数字也就无法更新。 解决方法,一种方法是在另外的线程中处理定时器事件,可把Timer加入到NSOperation中在另一 个线程中调度;还有一种方法时修改Timer运行的run loop模式,将其加入到UITrackingRunLoopMode模式或NSRunLoopCommonModes模式中。
即[[NSRunLoop currentRunLoop] addTimer:timer forMode:UITrackingRunLoopMode];或
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
- ioS开发之UI基础--NSRunLoop了解
- IOS开发之NSRunLoop
- iOS开发之NSRunLoop
- ioS开发之UI基础--UITableView简单了解(个人笔记)
- iOS开发之NSRunLoop概述
- ios开发之UI基础
- IOS开发之nsrunloop开发指南
- iOS开发之UI基础--Button基础
- iOS基础开发-UI基础之UIScrollview
- iOS开发之旅--NSRunLoop 详解
- ios开发之UI基础--transframe属性
- ios开发之UI基础--懒加载
- iOS开发之UI基础--KVC
- IOS开发UI基础之综合应用
- IOS-UI-基础开发
- iOS多线程之NSRunloop
- iOS巅峰之NSRunLoop
- IOS学习之iOS开发UI篇—Button基础
- android animation
- POJ3154(Graveyard)
- HDU 2085 核反应堆(水)
- [转]简单介绍如何使用robotium进行自动化测试
- 模板方法模式
- ioS开发之UI基础--NSRunLoop了解
- 使用 maven 构建 全注解spring+ hibernate4 + struts2 项目
- linux大杂烩
- Spring学习(十二)struts2+spring+hibernate环境搭建
- AndroidStudioTip--用Builder模式替代构造方法
- Future,FutureTask,Executors,ExecutorService,Callable学习笔记
- 线索二叉树
- HDU1018(Big Number)
- 欢迎使用CSDN-markdown编辑器