CFRunLoop 初次相识
CFRunLoop的初次相识,不了解他,也不认识她。
我参考的文章中,有一处是这么说的
Run loops是线程的基础架构部分。一个run loop就是一个事件处理循环,用来不停的调配工作以及处理输入事件。使用run loop的目的是使你的线程在有工作的时候工作,没有的时候休眠。
Run loop的管理并不完全是自动的。你仍必须设计你的线程代码以在适当的时候启动run loop并正确响应输入事件。Cocoa和CoreFundation都提供了run loop对象方便配置和管理线程的run loop。你创建的程序不需要显示的创建run loop;每个线程,包括程序的主线程(main thread)都有与之相应的run loop对象。但是,自己创建的次线程是需要手动运行run loop的。在carbon和cocoa程序中,程序启动时,主线程会自行创建并运行run loop。
接下来的部分将会详细介绍run loop以及如何为你的程序管理run loop。关于run loop对象可以参阅sdk文档。
解析Run Loop
run loop,顾名思义,就是一个循环,你的线程在这里开始,并运行事件处理程序来响应输入事件。你的代码要有实现循环部分的控制语句,换言之就是要有while或for语句。在run loop中,使用run loop对象来运行事件处理代码:响应接收到的事件,启动已经安装的处理程序。
Run loop处理的输入事件有两种不同的来源:输入源(input source)和定时源(timer source)。输入源传递异步消息,通常来自于其他线程或者程序。定时源则传递同步消息,在特定时间或者一定的时间间隔发生。两种源的处理都使用程序的某一特定处理路径。
在苹果官方是这样解释的。
A CFRunLoop object monitors sources of input to a task and dispatches control when they become ready for processing. Examples of input sources might include user input devices, network connections, periodic or time-delayed events, and asynchronous callbacks.
无奈,找到了一个例子:
// used by thread2 to force thread exit
- (void)forceExit:(ThreadObj*)obj {
obj.nExitFlag = 1;
NSLog(@"The current forceExit id = %@", self);
}
// for thread1
- (void)func1 {
nExitFlag = 0;
NSLog(@"The current func1 id = %@", self);
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
//A runloop with no sources returns immediately from runMode:beforeDate:
//That will wake up the loop and chew CPU. Add a dummy source to prevent
//it.
NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
NSMachPort *dummyPort = [[NSMachPort alloc] init];
[runLoop addPort:dummyPort forMode:NSDefaultRunLoopMode];
[dummyPort release];
[pool release];
while (!nExitFlag){
NSAutoreleasePool *loopPool = [[NSAutoreleasePool alloc] init];
[runLoop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
[loopPool drain];
}
}
// for thread2
- (void)func2:(NSArray *)args {
nExitFlag = 0;
NSLog(@"The current func2 id = %@", self);
NSThread* thread1 = [args objectAtIndex:1];
id id1 = [args objectAtIndex:0];
// force thread1 to exit
[self performSelector:@selector(forceExit:) onThread:thread1 withObject:id1 waitUntilDone:YES];
}
里面就是这样调用了一下,输出的结果是:
2013-07-30 10:06:04.714 MyRunLoop[55395:1803] The current func1 id = <ThreadObj: 0x7132590>
2013-07-30 10:06:04.716 MyRunLoop[55395:2003] The current func2 id = <ThreadObj: 0x7132600>
2013-07-30 10:06:04.720 MyRunLoop[55395:1803] The current forceExit id = <ThreadObj: 0x7132600>
2013-07-30 10:06:05.135 MyRunLoop[55395:c07] Application windows are expected to have a root view controller at the end of application launch
是这样子的,你如果自己运行的话,估计会跟我有些区别的。
具体干嘛用,有时间继续 研究,对了还有一个知识点就是:NSMachPort
这个看起来也有大用处,好像跟传递文件有关系
NSMachPort is a subclass of NSPort that can be used as an endpoint for distributed object connections (or raw messaging). NSMachPort is an object wrapper for a Mach port, the fundamental communication port in OS X. NSMachPort allows for local (on the same machine) communication only. A companion class, NSSocketPort, allows for both local and remote distributed object communication, but may be more expensive than NSMachPort for the local case.
好像越来越强大啦,呵呵
参考的文章地址:
版权声明
由 davidzhang创作并维护的 Gowhich博客采用创作共用保留署名-非商业-禁止演绎4.0国际许可证。
本文首发于 博客( https://www.gowhich.com ),版权所有,侵权必究。
本文永久链接: https://www.gowhich.com/blog/298
版权声明
由 davidzhang创作并维护的 Gowhich博客采用创作共用保留署名-非商业-禁止演绎4.0国际许可证。
本文首发于 Gowhich博客( https://www.gowhich.com ),版权所有,侵权必究。
本文永久链接: https://www.gowhich.com/blog/298