底层

深入理解RunLoop(二)

 ̄綄美尐妖づ 提交于 2019-12-16 11:21:14
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 其内部代码整理如下 (太长了不想看可以直接跳过去,后面会有说明): /// 用DefaultMode启动 void CFRunLoopRun(void) { CFRunLoopRunSpecific(CFRunLoopGetCurrent(), kCFRunLoopDefaultMode, 1.0e10, false); } /// 用指定的Mode启动,允许设置RunLoop超时时间 int CFRunLoopRunInMode(CFStringRef modeName, CFTimeInterval seconds, Boolean stopAfterHandle) { return CFRunLoopRunSpecific(CFRunLoopGetCurrent(), modeName, seconds, returnAfterSourceHandled); } /// RunLoop的实现 int CFRunLoopRunSpecific(runloop, modeName, seconds, stopAfterHandle) { /// 首先根据modeName找到对应mode CFRunLoopModeRef currentMode = __CFRunLoopFindMode(runloop,

深入理解RunLoop(三)

牧云@^-^@ 提交于 2019-12-16 11:15:57
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 苹果用 RunLoop 实现的功能 首先我们可以看一下 App 启动后 RunLoop 的状态: CFRunLoop { current mode = kCFRunLoopDefaultMode common modes = { UITrackingRunLoopMode kCFRunLoopDefaultMode } common mode items = { // source0 (manual) CFRunLoopSource {order =-1, { callout = _UIApplicationHandleEventQueue}} CFRunLoopSource {order =-1, { callout = PurpleEventSignalCallback }} CFRunLoopSource {order = 0, { callout = FBSSerialQueueRunLoopSourceHandler}} // source1 (mach port) CFRunLoopSource {order = 0, {port = 17923}} CFRunLoopSource {order = 0, {port = 12039}} CFRunLoopSource {order = 0,

深入理解RunLoop(一)

不打扰是莪最后的温柔 提交于 2019-12-16 11:08:52
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> RunLoop 是 iOS 和 OSX 开发中非常基础的一个概念,这篇文章将从 CFRunLoop 的源码入手,介绍 RunLoop 的概念以及底层实现原理。之后会介绍一下在 iOS 中,苹果是如何利用 RunLoop 实现自动释放池、延迟回调、触摸事件、屏幕刷新等功能的。 RunLoop 的概念 一般来讲,一个线程一次只能执行一个任务,执行完成后线程就会退出。如果我们需要一个机制,让线程能随时处理事件但并不退出,通常的代码逻辑是这样的: function loop() { initialize(); do { var message = get_next_message(); process_message(message); } while (message != quit); } 这种模型通常被称作 Event Loop 。 Event Loop 在很多系统和框架里都有实现,比如 Node.js 的事件处理,比如 Windows 程序的消息循环,再比如 OSX/iOS 里的 RunLoop。实现这种模型的关键点在于:如何管理事件/消息,如何让线程在没有处理消息时休眠以避免资源占用、在有消息到来时立刻被唤醒。 所以,RunLoop 实际上就是一个对象,这个对象管理了其需要处理的事件和消息

深入理解RunLoop(四)

不羁的心 提交于 2019-12-16 11:04:06
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 关于网络请求 iOS 中,关于网络请求的接口自下至上有如下几层: CFSocket CFNetwork ->ASIHttpRequest NSURLConnection ->AFNetworking NSURLSession ->AFNetworking2, Alamofire • CFSocket 是最底层的接口,只负责 socket 通信。 • CFNetwork 是基于 CFSocket 等接口的上层封装,ASIHttpRequest 工作于这一层。 • NSURLConnection 是基于 CFNetwork 的更高层的封装,提供面向对象的接口,AFNetworking 工作于这一层。 • NSURLSession 是 iOS7 中新增的接口,表面上是和 NSURLConnection 并列的,但底层仍然用到了 NSURLConnection 的部分功能 (比如 com.apple.NSURLConnectionLoader 线程),AFNetworking2 和 Alamofire 工作于这一层。 下面主要介绍下 NSURLConnection 的工作过程。 通常使用 NSURLConnection 时,你会传入一个 Delegate,当调用了 [connection start] 后,这个