• Dispatch Source

    目录 概述 事件与种类 使用 Dispatch Source 概述 iOS 中有两种 Source,一种是 Run Loop Source ,一种是 Dispatch Source。 Source 可以理解为产生事件的地方,Source 产生事件,然后 Source 的回调函数负责 处理这些事件。 在 Run Loop 中, Run Loop Source 产生事件,之后唤醒 Run Loop, Run Loop 便执行该 Source 的回调函数。 Dispatch Source 也会产生一些特定的事件,当这些事件发生的时候,其回调的 block 会自动加入到 对应的 dispatch queue 中。 事件与种类 Dispatch Source 监控的事件主要有以下几种:...


  • Run Loop

    目录 介绍 用途 Runloop Mode Runloop Mode Item Run Loop 运行机制 自定义 input source 介绍 Run Loop 正如其字面意思一样,表示运行循环,可以理解为一个 do-while 循环。Run Loop 与线程密切相关,每个线程对应着自己的一个 Run Loop,但是除了主线程的 Run Loop 是默认开启之外,剩下的线程的 Run Loop 一开始是不存在的,需要手动通过 [NSRunLoop currentRunLoop] 或 CFRunLoopGetCurrent() 获取当前线程的 Run Loop,这两个方法分别对应着 Foundation 框架和 Core Foundation 框架,它们的原理为,若当前线程对应的 Run Loop 存在的时候,直接返回该 Run Loop,当该线程当前不存在 Run Loop 时候,就创建当前线程的...


  • iOS 中线程同步的一些方法

    目录 使用串行队列 使用 dispatch_group 使用 dispatch_barrier 使用 dispatch_semaphore 串行队列 使用串行队列,对于一个资源,同一时刻只有一个任务(线程)访问,这样就避免了资源竞争,实现了资源的同步。我们可以通过 NSOperationQueue 或 dispatch queue来实现串行队列。 NSOperationQueue 创建一个 NSOperationQueue 队列,然后将该队列的最大并发数设置为 1,就是一个串行队列。 NSOperationQueue * queue = [[NSOperationQueue alloc] init]; queue.maxConcurrentOperationCount = 1;//每次只执行一个任务 for (NSInteger count = 0 ; count < 10; count ++) { [queue addOperation: [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"%ld",count); } ]]; } dispatch...


  • 关于 UILocalNotification 的几个问题

    问题 如何修改已经启动的UILocalNotification 为何cancelAllLocalNotifications方法调用完毕之后并不生效 回答 停止已经启动的UILocalNotification,创建一个新的UILocalNotification并启动,直接修改已经启动的UILocalNotification是不生效的,因为你在[[UIApplication sharedApplication] scheduleLocalNotification:notification]的时候,复制了一个当前的notification,并提交到系统的推送队列上,假如不提交的话,系统是不认识这个notification的。 执行完 cancelAllLocalNotifications 后,你再打印[UIApplication sharedApplication].scheduledLocalNotifications,发现其并不为空,stackoverflow 上有人说这个方法不是同步执行的,只会在当前的 run loop 结束之后生效,有人说可以通过 [UIApplication sharedApplication].scheduledLocalNotifications = nil 的方法使其立即生效,测试发现并没有什么作用,真正有用的方法还是 stackoverflow 上一个开发者提出的变通方法: [[UIApplication sharedApplication] cancelAllLocalNotifications]; long count; while ((count = [[[UIApplication sharedApplication] scheduledLocalNotifications] count]) > 0) { NSLog(@"Remaining notificaitons to cancel: %lu",(unsigned long)count); [NSThread sleepForTimeInterval:.01f]; } 对于问题1,有时候在 [[UIApplication sharedApplication] cancelLocalNotification:notification]...


  • iOS8 中的实时模糊 View-UIVisualEffectView

    介绍 在iOS7 以后,整个扁平化的 iOS 界面都大量采用了高斯模糊的效果来展示层次,比如在主界面上从底面上划出来 的控制面板,或者从顶部向下划出来的通知栏界面,都实时模糊了主界面背景,在 iOS7 的时候我们总共有 3.5 个办法来实现这些效果: 利用苹果开源的 UIImage+ImageEffects 利用 GPUImage 的高斯模糊滤镜 利用CoreImage 的高斯模糊滤镜 在 iOS7 初期的时候还有人使用 UIToolBar 覆盖在 superView 上的方法来实现,但是后来这个方法失效了,所以只能算半个。不过到了 iOS8,苹果提供了一个非常好用的方案-UIVisualEffectView。 UIVisualEffectView 是 UIView 的子类,因此使用的时候就是实例化一个 UIVisualEffectView,然后添加到superView 上就 OK 了。 That‘s it,就这么简单。 UIVisualEffectView 有两种效果,一种是 UIBlurEffect,即高斯模糊效果,一种是 UIVibrancyEffect,这种效果能把背景 View 和 当前 View 混合起来,通常使用的时候要在模糊后的 View 上 显示一些内容的话,就要在 UIBlurEffect 的 View...