ios多线程技术

•NSThread:

  –优点:NSThread 比其他两个轻量级,使用简单
  –缺点:需要自己管理线程的生命周期、线程同步、加锁、睡眠以及唤醒等。线程同步对数据的加锁会有一定的系统开销
 
•NSOperation

   –不需要关心线程管理,数据同步的事情,可以把精力放在自己需要执行的操作上

   –NSOperation是面向对象的

   - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;

•如果要更新UI界面,可以在后台线程中调用 performSelectorOnMainThread方法
 
•提示:尽管使用performSelectorInBackground方法调用的任务可以更新UI界面,但是在实际开发中,涉及到UI界面的更新操作,还是要使用performSelectorOnMainThread   方法,以避免不必要的麻烦
 
•开启后台执行任务的方法
 
   -(void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg
 
•在后台线程中通知主线程执行任务的方法
 
   –(void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;
 
•获取线程信息
 
   [NSThread currentThread];
 
•线程休眠
 
   [NSThread sleepForTimeInterval:1.0f];
 
 
 + (void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(id)argument;
 - (id)initWithTarget:(id)target selector:(SEL)selector object:(id)argument;
•detachNewThreadSelector方法会直接启动线程方法
•initWithTarget需要调用start方法才能够启动线程方法
•参数说明:
  –selector:线程执行的方法,只能有一个参数,不能有返回值
  –target:selector消息发送的对象
  –argument:传输给target的唯一参数,也可以是nil
 
•NSOperation的两个子类
  1.NSInvocationOperation
  2.NSBlockOperation
•工作原理:
  1.用NSOperation封装要执行的操作
  2.将创建好的NSOperation对象放NSOperationQueue中
  3.启动OperationQueue开始新的线程执行队列中的操作
•注意事项:
  1.使用多线程时通常需要控制线程的并发数,因为线程会消耗系统资源,同时运行的线程过多,系统会变慢
  2.使用以下方法可以控制并发的线程数量:
-(void)setMaxConcurrentOperationCount:(NSInteger)cnt;
 
NSInvocation/NSBlockOperation演练
 
 
通过 addDependency建立线程之间的联系 / 限制线程数量
•GCD队列:
  –Grand Central Dispatch是由苹果开发的一个多核编程的解决方案。iOS4.0+才能使用,是替代NSThread, NSOperation的高效和强大的技术
  –GCD是基于C语言的
GCD的优点:
  –充分利用多核
  –所有的多线程代码集中在一起,便于维护
  –GCD中无需使用@autoreleasepool
  -如果要顺序执行,可以使用dispatch_sync同步方法
  -dispatch_async无法确定任务的执行顺序
 
1.全局队列:所有添加到主队列中的任务都是并发执行的
  •全局队列(可能会开启多条线程)
   dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
2.串行队列:所有添加到串行队列中的任务都是顺序执行的
  •串行队列(只可能会开启一条线程)
   dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL);
3.主队列:所有添加到主队列中的任务都是在主线程中执行的
  •主队列
   dispatch_get_main_queue();

 •异步操作

   –dispatch_async 在其他线程执行任务,会开启新的线程

   –异步方法无法确定任务的执行顺序 

•同步操作

   –dispatch_sync 在当前在当前线程执行任务,不开启新的线程

  –同步操作与队列无关
 
  –同步方法会依次执行,能够决定任务的执行顺序
 
  –更新界面UI时,最好使用同步方法

GCD就是为了在多核上使用多线程技术

     1> 要使用GCD,所有的方法都是dispatch开头的

     2> 名词解释

     global  全局

     queue   队列

     async   异步

     sync    同步 

     3> 要执行异步的任务,就在全局队列中执行即可

      dispatch_async 异步执行控制不住先后顺序

     4> 关于GCD的队列

      全局队列    dispatch_get_global_queue

     参数:优先级 DISPATCH_QUEUE_PRIORITY_DEFAULT

     始终是 0

     串行队列    dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL);

     是创建得到的,不能直接获取

     主队列      dispatch_get_main_queue

     5> 异步和同步与方法名无关,与运行所在的队列有关!

     提示:要熟悉队列于同步、异步的运行节奏,一定需要自己编写代码测试!同步主要用来控制方法的被调用的顺序

 
 
 
 
---------------------线程锁-------------------
 
 
 
---------------------通过NSBlockOperation内存缓存-------------------
 
 
 
---------------------内存管理-------------------
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值