zoukankan      html  css  js  c++  java
  • IOS多线程(NSThread,NSOperation,Grand Central Dispatch)

    •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内存缓存-------------------
     
     
     
    ---------------------内存管理-------------------
     
     
     
  • 相关阅读:
    考研大数据爬取与分析工具3.0运行结果
    人教社免费公布全学段教材电子版(附地址)
    TeamViewer 15.7.7H俄罗斯大神破解商业版 可换ID
    手机看电视直播,高清电视直播+TV影院 v1.5.0无广告免费观看全网影视资源
    vue组件兄弟间通信
    vue组件父子间通信之综合练习--假的聊天室
    vue组件父子间通信02
    Vue组件父子间通信01
    vue组件间通信子与父
    vue组件父与子通信-登录窗口
  • 原文地址:https://www.cnblogs.com/BinShao/p/zhibin.html
Copyright © 2011-2022 走看看