• 线程间的通信的几种方式


    线程间的通信:

     - 什么叫做线程间通信

        - 在1个进程中,线程往往不是孤立存在的,多个线程之间需要经常进行通信
     
      - 线程间通信的体现
        - 1个线程传递数据给另1个线程
        - 在1个线程中执行完特定任务后,转到另1个线程继续执行任务
      - 线程间通信常用方法
        - 方法一:利用perform的方式
    - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;
    - (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait;

         - 方法二:NSPort

       - 配置NSMachPort对象---本地线程间通信,通过传递端口对象变量进行端口间通讯

       基本机制:A线程(父线程)创建NSMachPort对象,并加入A线程的run loop。当创建B线程(辅助线程)时,将创建的NSMachPort对象传递到主体入口点,B线程(辅助线程)就可以使用相同的端口对象将消息传回A线程(父线程)。    

       - NSPort是通过代理模式传送消息

          - it forwards the message to its delegate in a handleMachMessage: or handlePortMessage: message.

    - (void)handleMachMessage:(void *)machMessage
    
    - (void)handlePortMessage:(NSPortMessage *)portMessage

      - 官方文档翻译

    NSPort是一个描述通信通道的抽象类。通信发生在两个NSPort对象之中,这两个NSPort对象通常属于不同的进程或任务。分发对象系统使用NSPort对象来返回或发送NSProtMessage对象。你应该尽可能使用分发对象来完成应用间通信,必要时才使用NSPort对象。

    要接收发来的消息,NSPort对象必须作为输入源被添加到NSRunLoop对象中。NSConnection对象在初始化时自动添加它们的接收端口。

    当一个NSPort对象接收到一个端口消息,便把这条消息在handleMachMessage:或者handlePortMessge:消息中传送给它的代理。这个代理应该至少实现其中一个方法来处理要接收的消息,不管你想要实现什么功能。handleMachMessage:提供了一个早期的Mach内核消息,它以msg_header_t结构体为起始。handlePortMessage:提供了一个作为NSPortMessage对象的消息,这个对象是Mach消息面向对象的替代品。如果没有设置代理,这个NSPort对象会自己处理这条消息。

    当你使用NSPort对象完成消息处理,你必须首先使这个端口对象失效,然后再发送release消息。类似的处理还有,如果你的应用使用了垃圾回收,你必须先使端口失效,然后移除它的一些强引用。如果你没有是端口失效,就可能引起内存泄漏。要使端口失效,请调用invalidate方法。

    基础框架定义了三个具体的NSPort子类。NSMachPort和NSMessagePort只允许本地(在一样的机器上)通信。NSSocketPort允许本地和远程两种通讯,但是对于本地通信,NSSocketPort会更加耗费资源。创建NSPort对象,可以使用allocWithZone:或port,NSMachPort对象创建例外。

    - GCD的方式

      - 子线程回到主线程

    dispatch_async(
    dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        // 执行耗时的异步操作...
          dispatch_async(dispatch_get_main_queue(), ^{
            // 回到主线程,执行UI刷新操作
            });
    });
  • 相关阅读:
    Java程序员必知的8大排序(转载)
    Eclipse快捷键大全(转载)
    Java强引用、 软引用、 弱引用、虚引用(转)
    java数据类型二(转)
    为什么静态成员、静态方法中不能用this和super关键字(转)
    POJ 2002
    POJ 3126的教训
    POJ 3349
    POj 1105解题报告
    POJ 3278
  • 原文地址:https://www.cnblogs.com/samyangldora/p/4631815.html
Copyright © 2020-2023  润新知