美文网首页
NSPort 和 RunLoop 消息发送

NSPort 和 RunLoop 消息发送

作者: Albert新荣 | 来源:发表于2021-05-18 15:12 被阅读0次

NSPort与NSRunloop的关系是流与消息调度的关系。

NSPort 将流插入到消息调度队列;

相当于 Socket将流插入到应用一样

- (void)launchThread {

    NSPort *myport = [NSMachPort port];

    if(myport) {

        //让本类持有即将到来的端口消息。

        [myport setDelegate:self];

        //将port添加到当前的runloop

        [[NSRunLoop currentRunLoop] addPort:myport forMode:NSDefaultRunLoopMode];

        //当前线程调起工作线程

        [NSThread detachNewThreadSelector:@selector(LaunchThreadWithPort:) toTarget:[MyWorkerClass new] withObject:myport];

    }

}

 

#pragma mark - port delegate 

 

#define kCheckinMessage 1002233

 

- (void)handlePortMessage:(NSPortMessage *)message {

    NSLog(@"接收到子线程额消息");

    //消息的id

    uint32_t messageID = message.msgid;

    //获取远程端口,也就是工作线程的端口。线程通信需要两个端口??

    /*

     * 本地线程和远程线程可以使用相同的端口对象进行“单边通信”,(换句话说)一个线程创建的“本地端口对象”成为另一个线程的“远程端口对象”。

     *

     */

    NSPort *distanPort = nil;

    if(messageID == kCheckinMessage) {

        //获取工作线程关联的端口

        distanPort = message.sendPort;

    }

    NSLog(@"工作线程的port===%@",distanPort);

}

 

- (void)LaunchThreadWithPort:(id)port {

    //

    [[NSThread currentThread] setName:@"HaoyuWorkerThread"];

    //设置当前线程和主线程通信的端口

    NSPort *distantPort = (NSPort *)port;

    //初始化当前当前类的对象

    //MyWorkerClass *work = [MyWorkerClass new];

    //给主线程发送消息

    [self sendMessageToOtherThread:distantPort];

    //启动当前线程的runloop

    [[NSRunLoop currentRunLoop] run];

}

 

//private method

- (void)sendMessageToOtherThread:(NSPort *)outPort {

    self.remotePort = outPort;

    //创建工作线程自己的端口并绑定工作线程

    NSPort* myPort = [NSMachPort port];

    [myPort setDelegate:self];

    [[NSRunLoop currentRunLoop] addPort:myPort forMode:NSDefaultRunLoopMode];

   //创建签到消息

    NSPortMessage *messageObjc = [[NSPortMessage alloc] initWithSendPort:outPort receivePort:myPort components:@[@"aa",@"bb"]];

    

    if(messageObjc) {

        uint32_t kCheckinMessage = 1002233;

        [messageObjc setMsgid:kCheckinMessage];

        BOOL sendSuccess = [messageObjc sendBeforeDate:[NSDate date]];

        if(sendSuccess) {
            NSLog(@"发送成功");
        }
    }
}

 
#pragma mark - delegate 
- (void)handlePortMessage:(NSPortMessage *)message {

    NSLog(@"接收到父线程的消息");

}

转自https://www.cnblogs.com/feng9exe/p/8867475.html

相关文章

  • NSPort 和 RunLoop 消息发送

    NSPort与NSRunloop的关系是流与消息调度的关系。 NSPort 将流插入到消息调度队列; 相当于 So...

  • runloop 源码详解

    Runloop 里面基本上包括的几个方面的内容source [source0, source1[和nsport有关...

  • runloop与runtime

    runloop是一个循环,用来处理事件和派发事件. runtime是消息机制,主要发送消息给对象和转发消息.

  • RunLoop最细详解

    Runloop的实现机制 RunLoop 通过mach_msg()函数接收、发送消息。它的本质是调用函数 mach...

  • NSPort (简称端口)

    NSPort 这里就分为: 内核端口、消息端口、套接字端口 NSMachPort 内核端口 NSMessag...

  • Runloop-事件循环实现机制

    runloop启动后,会首先发送一个通知告诉观察者即将进入runloop;之后runloop会向观察者发送一个即将...

  • 48.Java实现消息发送

    消息发送和接收演示 接下来我们使用Java代码来演示消息的发送和接收 发送消息 消息发送步骤: 1.创建消息生产者...

  • 大文件下载--NSURLConnection--delegate

    NSURLConnection和Runloop补充 发送网络请求的过程放在子线程中操作

  • ActiveMq的发送原理

    持久化消息和非持久化消息的发送策略:消息同步发送和异步发送ActiveMQ支持同步、异步两种发送模式将消息发送到b...

  • rocketmq 消息发送源码分析总结

    DefaultMQProduce 主要作用 1发送消息,异步,同步,和OneWay发送。 消息发送消息流程...

网友评论

      本文标题:NSPort 和 RunLoop 消息发送

      本文链接:https://www.haomeiwen.com/subject/kxxyjltx.html