2013年9月11日

iOS多线程的初步研究(十)-- dispatch同步

摘要: GCD提供两种方式支持dispatch队列同步,即dispatch组和信号量。一、dispatch组(dispatch group)1. 创建dispatch组dispatch_group_t group = dispatch_group_create();2. 启动dispatch队列中的block关联到group中dispatch_group_async(group, queue, ^{ // 。。。});3. 等待group关联的block执行完毕,也可以设置超时参数dispatch_group_wait(group, DISPATCH_TIME_FOREVER);4. 为group设. 阅读全文

posted @ 2013-09-11 13:33 技术内幕 阅读(10764) 评论(0) 推荐(1) 编辑

2013年9月10日

iOS多线程的初步研究(九)-- dispatch源

摘要: dispatch源(dispatch source)和RunLoop源概念上有些类似的地方,而且使用起来更简单。要很好地理解dispatch源,其实把它看成一种特别的生产消费模式。dispatch源好比生产的数据,当有新数据时,会自动在dispatch指定的队列(即消费队列)上运行相应地block,生产和消费同步是dispatch源会自动管理的。dispatch源的使用基本为以下步骤:1. dispatch_source_t source = dispatch_source_create(dispatch_source_type, handler, mask, dispatch_queue); 阅读全文

posted @ 2013-09-10 21:11 技术内幕 阅读(9608) 评论(2) 推荐(1) 编辑

2013年9月8日

iOS多线程的初步研究(八)-- dispatch队列

摘要: GCD编程的核心就是dispatch队列,dispatch block的执行最终都会放进某个队列中去进行,它类似NSOperationQueue但更复杂也更强大,并且可以嵌套使用。所以说,结合block实现的GCD,把函数闭包(Closure)的特性发挥得淋漓尽致。dispatch队列的生成可以有这几种方式:1. dispatch_queue_t queue = dispatch_queue_create("com.dispatch.serial", DISPATCH_QUEUE_SERIAL); //生成一个串行队列,队列中的block按照先进先出(FIFO)的顺序去执行 阅读全文

posted @ 2013-09-08 20:26 技术内幕 阅读(16163) 评论(1) 推荐(4) 编辑

2013年9月6日

iOS多线程的初步研究(七)-- dispatch对象

摘要: 谈起iOS的dispatch(正式称谓是Grand Central Dispatch或GCD),不得不说这又是iOS(包括MacOSX)平台的创新,优缺点这里不讨论,只有当你使用时才能真正体会到。我们说dispatch函数的主要目的是实现多任务并发代码,那么要理解dispatch函数,先来了解dispatch对象的定义。dispatch对象类型的部分定义,主要使用C语言的宏定义:文件:#define OS_OBJECT_CLASS(name) OS_##name#define OS_OBJECT_DECL(name, ...) \@protocol OS_OBJECT_CLASS(name) 阅读全文

posted @ 2013-09-06 16:13 技术内幕 阅读(3435) 评论(0) 推荐(0) 编辑

2013年8月25日

iOS多线程的初步研究(六)-- NSOperation

摘要: iOS平台提供更高级的并发(异步)调用接口,让你可以集中精力去设计需完成的任务代码,避免去写与程序逻辑无关的线程生成、运行等管理代码。当然实质上是这些接口隐含生成线程和管理线程的运行,从而更加简洁地实现多线程。下面先来研究NSOperation和NSOperationQueue类的使用。NSOperation实质是封装了需要并发运行的代码,一些主要接口和NSThread基本相同,可以看做没有线程运行能力的thread类的抽象。参考NSThread,NSOperation的一些相同的接口有:- (void)start; //在当前任务状态和依赖关系合适的情况下,启动NSOperation的mai 阅读全文

posted @ 2013-08-25 13:50 技术内幕 阅读(5797) 评论(0) 推荐(1) 编辑

2013年8月17日

iOS多线程的初步研究(五)-- 如何让NSURLConnection在子线程中运行

摘要: 可以有两个办法让NSURLConnection在子线程中运行,即将NSURLConnection加入到run loop或者NSOperationQueue中去运行。前面提到可以将NSTimer手动加入NSRunLoop,Cocoa库也为其它一些类提供了可以手动加入NSRunLoop的方法,这些类有NSPort、NSStream、NSURLConnection、NSNetServices,方法都是[scheduleInRunLoop:forMode:]形式。我暂时只介绍下最常用的NSURLConnection类,看看如何把NSURLConnection的网络下载加入到其它线程的run loop去 阅读全文

posted @ 2013-08-17 21:47 技术内幕 阅读(4260) 评论(0) 推荐(0) 编辑

2013年8月16日

iOS多线程的初步研究(三)-- NSRunLoop

摘要: 弄清楚NSRunLoop确实需要花时间,这个类的概念和模式似乎是Apple的平台独有(iOS+MacOSX),很难彻底搞懂(iOS没开源,呜呜)。官网的解释是说run loop可以用于处理异步事件,很抽象的说法。不罗嗦,先看看NSRunLoop几个常用的方法。+ (NSRunLoop *)currentRunLoop; //获得当前线程的run loop+ (NSRunLoop *)mainRunLoop;//获得主线程的run loop- (void)run; //进入处理事件循环,如果没有事件则立刻返回。注意:主线程上调用这个方法会导致无法返回(进入无限循环,虽然不会阻塞主线程),因为主线 阅读全文

posted @ 2013-08-16 09:32 技术内幕 阅读(12259) 评论(2) 推荐(3) 编辑

2013年8月15日

iOS多线程的初步研究(二)-- 锁

摘要: 谈到线程同步,一般指如何对线程间共享数据的同步读写,如何避免混乱的读写结果。一个基本的解决办法就是使用锁(LOCK)。iOS提供多种同步锁的类和方法,这里介绍下基本用法。1. NSLock:最基本的同步锁,使用lock来获得锁,unlock释放锁。如果其它线程已经使用lock,这时lock方法会阻塞当前线程,直到其它线程调用unlock释放锁为止。NSLock锁一般用于简单的同步算法。比如生产者线程产生数据(produce),消费线程显示数据(consume),可以这样实现:- (void)produce{ while (1) { [theLock lock]; // crea... 阅读全文

posted @ 2013-08-15 21:09 技术内幕 阅读(4232) 评论(0) 推荐(3) 编辑

iOS多线程的初步研究(一)-- NSThread

摘要: 对于多线程的开发,iOS系统提供了多种不同的接口,先谈谈iOS多线程最基础方面的使用。产生线程的方式姑且分两类,一类是显式调用,另一类是隐式调用。一、显示调用的类为NSThread。一般构造NSThread的线程对象可通过两种方式:1. 初始化线程主方法:[NSThread detachNewThreadSelector:@selector(run:) toTarget:target withObject:obj];//类方法或NSThread *newThread = [[NSThread alloc] initWithTarget:target selector:@selector(run 阅读全文

posted @ 2013-08-15 15:16 技术内幕 阅读(11738) 评论(1) 推荐(3) 编辑

iOS多线程的初步研究(四)-- NSTimer

摘要: 理解run loop后,才能彻底理解NSTimer的实现原理,也就是说NSTimer实际上依赖run loop实现的。先看看NSTimer的两个常用方法:+ (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo; //生成timer但不执行+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti targe 阅读全文

posted @ 2013-08-15 09:29 技术内幕 阅读(3509) 评论(0) 推荐(0) 编辑

导航