- 浏览: 665492 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
lizaochengwen:
网络请求碰到的中文乱码使用encodeURL吧- (NSStr ...
iPhone开发/iPad开发 中文乱码问题 -
hhb19900618:
还是没弄懂怎么解决了中文乱码? 正确代码能重写贴出吗
iPhone开发/iPad开发 中文乱码问题 -
zhengjj_2009:
我的理解是讲ipa文件解压缩之后再重新打包,已经破坏了签名,所 ...
xcodebuild和xcrun实现自动打包iOS应用程序 -
zhengjj_2009:
我参考你的“ 从ipa格式的母包生成其它渠道包的shell脚本 ...
xcodebuild和xcrun实现自动打包iOS应用程序 -
同一片天空:
问题果然解决了
iOS 搭建 XMPP实现环境
转自:http://blog.csdn.net/lingedeng/article/details/6868734
Run loop mode是一组用于监控的input sources和timers以及一组用于通知的run loop observers。每次运行一个run loop,你指定(显式或隐式)run loop的运行模式。当相应的模式传递给run loop时,只有与该模式对应的input sources才被监控并允许run loop对事件进行处理(与此类似,也只有与该模式对应的observers才会被通知)。与指定模式不同的事件将被事件源保存下来直到相关的模式被注册后才被分发。
在你的代码中,mode使用名称来标识。在Cocoa和Core Foundation都定义了缺省模式和几个通用模式,使用字符串来对它们进行标识。你可以通过使用自定义的字符串来自定义模式。虽然可以为自定义的模式指定任意的名字,但模式所包含的内容却是固定的。也就是你必须为你自定义的模式添加一个或多个input sources,Timers或run-loop observers供模式使用。
你使用mode来对unwanted sources中通过run loop传递的事件进行过滤。大多数情况下,你希望你的run loop运行在系统定义的缺省模式下。A modal panel, however, might run in the “modal” mode. While in this mode, only sources relevant to the modal panel would deliver events to the thread. For secondary threads, you might use custom modes to prevent low-priority sources from delivering events during time-critical operations.
注:mode只对事件源进行区分,而不是事件类型。例如:你不能使用mode来匹配光标按键事件或键盘事件。你可以使用mode来监听一组不同的端口,使timer临时挂起或者改变当前监控的sources或run-loop observers。
下表为Cocoa和Core Foundation中定义的模式及简要描述。name列中是你在代码中指定的mode常量:
--------------------------------------------------------------------------------
Mode Name Description
--------------------------------------------------------------------------------
default NSDefaultRunLoopMode(Cocoa)
kCFRunLoopDefaultMode(Core Foundation) default mode是大多数操作中使用的模式。大多数时间,你使用该模式来启动run loop并配置你的input sources。
--------------------------------------------------------------------------------
connection NSConnectionReplyMode(Cocoa) Cocoa使用该模式与NSConnection对象联接用于监控响应。你通常不需要在你的代码中使用该模式。
--------------------------------------------------------------------------------
modal NSModalPanelRunLoopMode(Cocoa) Cocoa使用该模式来标识用于modal panel(模式面板)的事件。
--------------------------------------------------------------------------------
event tracking NSEventTracking-RunLoopMode (Cocoa) Cocoa使用该模式来限制光标拖动循环中上报的事件或其它用户界面相关的trace loop。
--------------------------------------------------------------------------------
common modes NSRunLoopCommonModes(Cocoa)
kCFRunLoopCommonModes(Core Foundation) 这是一组可配置的通用模式。将input sources与该模式关联则同时也将input sources与该组中的其它模式进行了关联。对于Cocoa应用,该模式缺省的包含了default,modal以及event tracking模式。而Core Foundation则在初始化时只包含了default模式。你可以使用CFRunLoopAddCommonMode为该模式添加自定义的模式。
--------------------------------------------------------------------------------
Input sources
input sources将事件以异步的形式发送给你的thread。事件源依赖于input sources的类型,通常分成一或两组。基于端口的事件源监控你机器的端口,自定义输入源监控事件的自定义源。Run loop并不关心input sources是基于端口或自定义的事件源。两个不同的输入源唯一的区别就是它们的标识方式。基于端口的输入源标识由内核自动生成,自定义的输入源由另外的thread手动产生。
当你创建了一个input sources,将其指定给你的run loop并分配一个或多个mode。当mode分配时会对input source的监控产生即时的影响。大多数情况,你运行你的run loop在缺省模式下,同时你也可以指定自定义模式。如果一个input sources不在当前监控的模式中,任何由该sources产生的事件都将被保存直至run loop运行于相应的模式下。
Port-Based sources
Cocoa和Core Foundation内置提供使用port相关的对象和函数创建port-based sources。例如,在Cocoa中你从来就不需要直接创建input sources。你只需要使用port对象以及NSPort的方法将port添加到run loop。Port对象将为你创建和配置input sources。
在Core Foundation,你需要自己创建port和run loop输入源。此时,你将使用与port不透明类型相关的函数(CFMachPortRef, CFMessagePortRef,CFSocketRef)来创建合适的对象。
自定义输入源
要创建自定义输入源,你必须使用与CFRunLoopSourceRef不透明类型相关的函数。你将使用数个回调函数来配置自定义输入源。Core Foundation通过在不同的时间来调用这些回调函数以完成source配置,处理事件以及当该source从run loop中移除时关闭该source。
除了定义当有事件到达时自定义输入源的行为,你还必须定义事件投递机制。This part of the source runs on a separate thread and is responsible for providing the input source with its data and for signaling it when that data is ready for processing. The event delivery mechanism is up to you but need not be overly complex.
Cocoa perform selector source
除了port-based sources,Cocoa定义了一组自定义输入源用于在任何thread中执行一个方法(selector)。与port-based源相类似,perform selector在thread中被序列化执行,这样就缓和了许多在同一个thread中运行多个方法所产生的同步问题。与port-based sources不同的是,perform selector source在运行完selector后自动从run loop中移除。
当在非main thread中perform selector时,其thread中必须有一个激活的run loop。对于你自己创建的thread而言,只有你的代码显式的运行一个run loop后该perform selector才能得到执行。Run loop在当loop运行时处理所有已排队的perform selector,而不是在一个loop循环时只处理某一个perform selector。
下表展示了perform selector调用方法:
--------------------------------------------------------------------------------
Methods Description
--------------------------------------------------------------------------------
performSelectorOnMainThread: withObject: waitUntilDone:
performSelectorOnMainThread: withObject: waitUntilDone:modes: 在应用程序的main thread的下一个run loop周期内调用指定的selector。这些方法为你提供了堵塞当前thread执行直至selector执行完成。
--------------------------------------------------------------------------------
performSelector: onThread:withObject: waitUntilDone:
performSelector: onThread:withObject: waitUntilDone:modes: 在已有的thread中调用指定的selector。这些方法为你提供了堵塞当前thread执行直至selector执行完成。
--------------------------------------------------------------------------------
performSelector: withObject: afterDelay:
performSelector: withObject: afterDelay:inModes: 在当前的thread的下一个run loop周期内并延迟一个可选的时间,调用指定的selector。
--------------------------------------------------------------------------------
cancelPreviousPerformRequestsWithTarget:
cancelPreviousPerformRequestsWithTarget: selector:object: 用于取消使用第三行中方法发向thread的消息。
--------------------------------------------------------------------------------
什么时候使用run loop?
只有在你创建了第二个thread时你才需要显式的运行run loop。对于main thread的run loop是作为框架的一部分。所以Cocoa和Carbon框架提供自动运行应用程序主循环的代码。IOS中UIApplication的run方法用于启动应用程序主循环并作为启动序列的一部分。如果你是使用Xcode template生成应用程序,则不需要对run方法进行显式的调用。
对于第二个thread,你需要决定是否有必要使用run loop,如果需要,则需要你手工进行配置和启动。你并不需要为每个新建的thread都建立run loop。例如:如果你使用你的thread运行一些长时间运行且可预知结果的任务,你就可以不启动该thread的run loop。Run loop所要解决的问题是你需要与该thread有很多的交互。
如遇到以下的情况,则你就需要启动thread内的run loop:
使用ports或自定义的input sources与其它thread进行交互;
在thread中使用Timers(定时器);
在Cocoa应用中使用任意performSelector...方法;
需要使用thread完成周期性的任务。
如果你决定使用run loop,则配置和运行将很直接。就像所有的多thread编程,你将考虑你新建thread的中止条件。总是将新建的thread安全退出好过强制退出
Run loop mode是一组用于监控的input sources和timers以及一组用于通知的run loop observers。每次运行一个run loop,你指定(显式或隐式)run loop的运行模式。当相应的模式传递给run loop时,只有与该模式对应的input sources才被监控并允许run loop对事件进行处理(与此类似,也只有与该模式对应的observers才会被通知)。与指定模式不同的事件将被事件源保存下来直到相关的模式被注册后才被分发。
在你的代码中,mode使用名称来标识。在Cocoa和Core Foundation都定义了缺省模式和几个通用模式,使用字符串来对它们进行标识。你可以通过使用自定义的字符串来自定义模式。虽然可以为自定义的模式指定任意的名字,但模式所包含的内容却是固定的。也就是你必须为你自定义的模式添加一个或多个input sources,Timers或run-loop observers供模式使用。
你使用mode来对unwanted sources中通过run loop传递的事件进行过滤。大多数情况下,你希望你的run loop运行在系统定义的缺省模式下。A modal panel, however, might run in the “modal” mode. While in this mode, only sources relevant to the modal panel would deliver events to the thread. For secondary threads, you might use custom modes to prevent low-priority sources from delivering events during time-critical operations.
注:mode只对事件源进行区分,而不是事件类型。例如:你不能使用mode来匹配光标按键事件或键盘事件。你可以使用mode来监听一组不同的端口,使timer临时挂起或者改变当前监控的sources或run-loop observers。
下表为Cocoa和Core Foundation中定义的模式及简要描述。name列中是你在代码中指定的mode常量:
--------------------------------------------------------------------------------
Mode Name Description
--------------------------------------------------------------------------------
default NSDefaultRunLoopMode(Cocoa)
kCFRunLoopDefaultMode(Core Foundation) default mode是大多数操作中使用的模式。大多数时间,你使用该模式来启动run loop并配置你的input sources。
--------------------------------------------------------------------------------
connection NSConnectionReplyMode(Cocoa) Cocoa使用该模式与NSConnection对象联接用于监控响应。你通常不需要在你的代码中使用该模式。
--------------------------------------------------------------------------------
modal NSModalPanelRunLoopMode(Cocoa) Cocoa使用该模式来标识用于modal panel(模式面板)的事件。
--------------------------------------------------------------------------------
event tracking NSEventTracking-RunLoopMode (Cocoa) Cocoa使用该模式来限制光标拖动循环中上报的事件或其它用户界面相关的trace loop。
--------------------------------------------------------------------------------
common modes NSRunLoopCommonModes(Cocoa)
kCFRunLoopCommonModes(Core Foundation) 这是一组可配置的通用模式。将input sources与该模式关联则同时也将input sources与该组中的其它模式进行了关联。对于Cocoa应用,该模式缺省的包含了default,modal以及event tracking模式。而Core Foundation则在初始化时只包含了default模式。你可以使用CFRunLoopAddCommonMode为该模式添加自定义的模式。
--------------------------------------------------------------------------------
Input sources
input sources将事件以异步的形式发送给你的thread。事件源依赖于input sources的类型,通常分成一或两组。基于端口的事件源监控你机器的端口,自定义输入源监控事件的自定义源。Run loop并不关心input sources是基于端口或自定义的事件源。两个不同的输入源唯一的区别就是它们的标识方式。基于端口的输入源标识由内核自动生成,自定义的输入源由另外的thread手动产生。
当你创建了一个input sources,将其指定给你的run loop并分配一个或多个mode。当mode分配时会对input source的监控产生即时的影响。大多数情况,你运行你的run loop在缺省模式下,同时你也可以指定自定义模式。如果一个input sources不在当前监控的模式中,任何由该sources产生的事件都将被保存直至run loop运行于相应的模式下。
Port-Based sources
Cocoa和Core Foundation内置提供使用port相关的对象和函数创建port-based sources。例如,在Cocoa中你从来就不需要直接创建input sources。你只需要使用port对象以及NSPort的方法将port添加到run loop。Port对象将为你创建和配置input sources。
在Core Foundation,你需要自己创建port和run loop输入源。此时,你将使用与port不透明类型相关的函数(CFMachPortRef, CFMessagePortRef,CFSocketRef)来创建合适的对象。
自定义输入源
要创建自定义输入源,你必须使用与CFRunLoopSourceRef不透明类型相关的函数。你将使用数个回调函数来配置自定义输入源。Core Foundation通过在不同的时间来调用这些回调函数以完成source配置,处理事件以及当该source从run loop中移除时关闭该source。
除了定义当有事件到达时自定义输入源的行为,你还必须定义事件投递机制。This part of the source runs on a separate thread and is responsible for providing the input source with its data and for signaling it when that data is ready for processing. The event delivery mechanism is up to you but need not be overly complex.
Cocoa perform selector source
除了port-based sources,Cocoa定义了一组自定义输入源用于在任何thread中执行一个方法(selector)。与port-based源相类似,perform selector在thread中被序列化执行,这样就缓和了许多在同一个thread中运行多个方法所产生的同步问题。与port-based sources不同的是,perform selector source在运行完selector后自动从run loop中移除。
当在非main thread中perform selector时,其thread中必须有一个激活的run loop。对于你自己创建的thread而言,只有你的代码显式的运行一个run loop后该perform selector才能得到执行。Run loop在当loop运行时处理所有已排队的perform selector,而不是在一个loop循环时只处理某一个perform selector。
下表展示了perform selector调用方法:
--------------------------------------------------------------------------------
Methods Description
--------------------------------------------------------------------------------
performSelectorOnMainThread: withObject: waitUntilDone:
performSelectorOnMainThread: withObject: waitUntilDone:modes: 在应用程序的main thread的下一个run loop周期内调用指定的selector。这些方法为你提供了堵塞当前thread执行直至selector执行完成。
--------------------------------------------------------------------------------
performSelector: onThread:withObject: waitUntilDone:
performSelector: onThread:withObject: waitUntilDone:modes: 在已有的thread中调用指定的selector。这些方法为你提供了堵塞当前thread执行直至selector执行完成。
--------------------------------------------------------------------------------
performSelector: withObject: afterDelay:
performSelector: withObject: afterDelay:inModes: 在当前的thread的下一个run loop周期内并延迟一个可选的时间,调用指定的selector。
--------------------------------------------------------------------------------
cancelPreviousPerformRequestsWithTarget:
cancelPreviousPerformRequestsWithTarget: selector:object: 用于取消使用第三行中方法发向thread的消息。
--------------------------------------------------------------------------------
什么时候使用run loop?
只有在你创建了第二个thread时你才需要显式的运行run loop。对于main thread的run loop是作为框架的一部分。所以Cocoa和Carbon框架提供自动运行应用程序主循环的代码。IOS中UIApplication的run方法用于启动应用程序主循环并作为启动序列的一部分。如果你是使用Xcode template生成应用程序,则不需要对run方法进行显式的调用。
对于第二个thread,你需要决定是否有必要使用run loop,如果需要,则需要你手工进行配置和启动。你并不需要为每个新建的thread都建立run loop。例如:如果你使用你的thread运行一些长时间运行且可预知结果的任务,你就可以不启动该thread的run loop。Run loop所要解决的问题是你需要与该thread有很多的交互。
如遇到以下的情况,则你就需要启动thread内的run loop:
使用ports或自定义的input sources与其它thread进行交互;
在thread中使用Timers(定时器);
在Cocoa应用中使用任意performSelector...方法;
需要使用thread完成周期性的任务。
如果你决定使用run loop,则配置和运行将很直接。就像所有的多thread编程,你将考虑你新建thread的中止条件。总是将新建的thread安全退出好过强制退出
发表评论
-
SOCK_STREAM和SOCK_DGRAM
2015-07-23 20:08 1665sock_stream 是有保障的(即能保证数据正确传送到 ... -
SOCKET bind INADDR_LOOPBACK和INADDR_ANY的区别
2015-07-23 19:49 2067今天写程序时候,服务器端启动了,然后客户端总是连接不上,con ... -
htons()
2015-07-23 19:26 593在C/C++写网络程序的时候,往往会遇到字节的网络顺序和主机顺 ... -
使用symbolicatecrash分析crash文件
2015-03-10 11:32 1191原文 http://www.cnblogs.com/ning ... -
程序设计中的计算复用(Computational Reuse)
2015-02-10 10:18 700从斐波那契数列说起 ... -
didReceiveMemoryWarning
2015-02-09 16:11 548IPhone下每个app可用的内存是被限制的,如果一个app使 ... -
iOS开发中怎么响应内存警告
2015-02-09 16:08 661好的应用应该在系统内存警告情况下释放一些可以重新创建的资源。在 ... -
ASIHTTPRequest多次重复请求的问题
2014-12-17 14:34 652在一个车票订购的项目中,点击一次订购,却生成了2次订单,通过抓 ... -
从 CloudKit 看 BaaS 服务的趋势
2014-09-26 11:51 735从 6 月份 WWDC 苹果发布 ... -
ios编程--AVCapture编程理解
2014-09-26 11:03 9610、媒体采集的几个东西。这里所需要明白的是,在这个流程中,这里 ... -
NSURLProtocol
2014-09-25 10:42 8341、http://nshipster.com/nsurlpro ... -
关于iOS8的extension插件
2014-09-25 10:41 1310关于iOS8的extension插件,有兴趣的同学可以参考一下 ... -
【转】ios app在itunesConnect里面的几种状态
2014-08-05 10:34 1161Waiting for Upload (Yellow) Ap ... -
[转]iOS Dev (45) iOS图标与切片处理工具Prepo
2014-02-07 17:02 1040iOS Dev (45) iOS图标与切片处理工具Prepo ... -
phoneGap开发IOS,JS调用IOS方法/phoneGap插件开发
2014-01-13 17:49 1251前沿 废话不说phoneGap是什么不多介绍,官方网站: h ... -
如何在IOS平台下搭建PhoneGap开发环境(PhoneGap2.5)
2014-01-13 15:23 756由于在下最近在做基于HTML5的跨平台移植,搭建环境的时候着实 ... -
xcode 4 制作静态库详解
2013-12-20 18:27 567最近在做Apple的IOS开发,有开发静态库的需求,本身IOS ... -
【翻译】ios教程-创建静态库
2013-12-20 18:19 3134作者:shede333 主页:htt ... -
封装自己的控件库:iPhone静态库的应用
2013-12-20 17:03 600由于iPhone 控件的极度匮乏和自定义组件在重用上的限制,在 ... -
iphone:使用NSFileManager取得目录下所有文件(遍历所有文件)
2013-11-18 17:56 883From:http://note.sdo.com/u/xiao ...
相关推荐
3. 在后台线程中使用RunLoop可以提高效率,例如在后台加载数据时,通过RunLoop控制何时唤醒主线程更新UI。 4. 注意RunLoop与GCD(Grand Central Dispatch)的配合使用,可以更好地进行并发控制。 总的来说,理解和...
4. **NSRunLoop**:在多线程中,尤其是后台线程,需要通过NSRunLoop来保持线程的活动状态,处理事件和调度任务。 5. **ThreadPool**:虽然iOS原生并不直接支持线程池,但开发者可以通过GCD的全局并行队列或自定义...
3. **线程间的同步与通信** - A. Autorelease Pool:在多线程环境中,每个线程都有自己的autoreleasepool,用于自动释放临时对象。当线程结束时,autoreleasepool会被自动清理。 - B. 线程间通信:可以通过GCD...
4. NSTimer与NSRunLoop:NSTimer可以配合NSRunLoop在特定线程上定时触发事件,通常用于周期性任务。 五、线程管理的挑战 尽管多线程带来了性能提升,但也增加了代码复杂性和潜在的线程安全问题。开发者需要关注...
#### 一、多线程编程概念与术语 **1.1 什么是多线程** 多线程是指在单个应用程序中能够同时执行多个任务的技术。它允许应用程序的不同部分并行运行,从而提高整体性能和响应速度。 **1.2 线程术语** - **线程**: ...
3. **NSThread**:直接创建和管理线程的API,适合对线程有高度定制需求的情况。 4. **NSRunLoop**:在线程中管理事件循环,确保线程不会立即退出,而是等待接收事件。 5. **NSInvocationOperation**和`...
RunLoop是iOS和macOS开发中的一个重要概念,它与线程管理息息相关,特别是在处理长时间运行的任务或者维护线程活跃状态时显得尤为重要。本文将深入探讨RunLoop的原理、作用以及如何利用RunLoop来保持线程的活性。 ...
#### 一、多线程编程的基本概念与术语 ##### 1.1 什么是多线程 多线程是操作系统的一种功能,它允许在一个应用程序内部同时运行多个执行路径,每个执行路径称为一个线程。通过多线程,可以提高应用程序的响应速度和...
在iOS开发中,`NSRunLoop` 是一个至关重要的概念,它是事件循环(event loop)的核心机制。`NSRunLoopDemo` 提供了关于`NSRunLoop`的实践案例,包括使用Timer、自定义Source、DispatchSource、配置RunLoop以及添加...
3. 实现基于GCD的异步任务,并在任务完成后通过`NSRunLoop`的模式(如`NSDefaultRunLoopMode`)发送通知,演示`NSRunLoop`与GCD的协作。 4. 演示如何在`NSRunLoop`中监听网络请求或其他I/O操作的完成,以便在数据...
在iOS应用开发中,多线程是一个至关重要的概念,它使得应用程序可以同时执行多个任务,提升用户体验并优化系统资源的利用。"IOS应用源码——多线程.zip"这个压缩包很可能包含了一个示例项目,演示了如何在iOS应用中...
【iOS多线程详解】 ...总之,iOS多线程涉及的技术和概念众多,开发者需要根据实际需求选择合适的方案,合理地利用多线程提升应用性能。无论选择哪种方案,都需要充分理解其工作原理,确保程序的稳定性和效率。
Run Loop是iOS开发中的一个重要概念,它在应用程序的生命周期中起着核心的作用。Run Loop,直译为“运行循环”,是一种机制,用于管理程序的主要线程(通常称为主线程)如何处理事件和用户输入,同时保持低功耗状态...
`NSThread`、`NSRunLoop`和`Dispatch Queue`是Apple的Foundation框架中用于多线程和异步任务处理的关键组件。本篇文章将深入探讨这三个概念,并通过`DispatchSourceTest.zip`中的示例代码来具体说明它们的用法。 ...
在Swift编程中,RunLoop是iOS、macOS等Apple平台中一个至关重要的概念,它与线程管理和事件处理紧密相关。本文将深入探讨如何从零开始实践RunLoop,特别是利用Ports和Custom Input Sources进行线程间通信以及其他...
本指南将深入探讨iOS并发编程的核心概念、技术及其应用,帮助开发者提升应用程序的效率和响应性。 一、GCD(Grand Central Dispatch) GCD是苹果提供的一种强大的并发编程工具,它是基于C语言的API,适用于...
- **NSRunLoop**:主要用于管理线程的事件循环,确保线程在没有工作时不会立即退出,有助于在后台线程中保持活动。 3. **回调函数**: 提到"使用了回调",这意味着在下载图片的过程中可能采用了代理方法或闭包...
3. **定时器(Timer)**:定时器可以在指定的时间间隔后触发事件,但需要注意的是,定时器并不保证精确的触发时间,因为RunLoop可能在预定时间未到时就进入了休眠。 4. **运行模式切换**:RunLoop会在不同模式之间...
5. 加入RunLoop:将定时器加入当前RunLoop,通常使用`[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];` 示例代码: ```swift let timer = Timer.scheduledTimer(timeInterval: 2.0, ...