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(@"接收到父线程的消息");

}

NSPort与NSRunloop的关系是流与消息调度的关系的更多相关文章

  1. Entity Framework管理实体关系(一):管理一对一关系

    我们现在已经知道如何使用Code First来定义简单的领域类,并且如何使用DbContext类来执行数据库操作.现在我们来看下数据库理论中的多样性关系,我们会使用Code First来实现下面的几种 ...

  2. HttpServletRequestWrapper 是HttpServletRequest的包装类 ·关系相当于 int 与integer的关系

    HttpServletRequestWrapper 是HttpServletRequest的包装类 ·关系相当于 int 与integer的关系

  3. Python面向对象02/类的空间问题、类与对象之间的关系、类与类之间的关系

    Python面向对象02/类的空间问题.类与对象之间的关系.类与类之间的关系 目录 Python面向对象02/类的空间问题.类与对象之间的关系.类与类之间的关系 1. 类的空间问题 2. 类与对象之间 ...

  4. python 面向对象专题(二):类的空间问题、类与对象之间的关系、类与类之间的关系

    https://www.cnblogs.com/liubing8/p/11308127.html 目录 Python面向对象02/类的空间问题.类与对象之间的关系.类与类之间的关系 1. 类的空间问题 ...

  5. Java中的流(4)InputStream,InputStreamReader,BufferedReader关系

    InputStream是字节流,InputStreamReader将字节流转成字符流,BufferedReader将字符流转成字符缓冲,开始读字符. 1.InputStream.OutputStrea ...

  6. Syste.IO命名空间下的流操作类之间的关系

  7. CRM 2016 子表单中N:1关系 字段要求与新建时的关系

    父表单在新建子表单项时弹出的窗口和 子表单的N:1关系是有关系的.说白了就是子表单窗体上的父表单字段是不是必填项. 关系如下: 1 非必填项 点击子表单的"+"号时,会出现look ...

  8. Zstack中任务,事件,消息之间的关系

    Zstack是Zigbee协议的具体实现,在实现的过程中为了能够更好的对各个模块和功能进行管理,所以加入了OSAL(Operating System Abstraction Layer 操作系统抽象层 ...

  9. CLOUD配置审批流发消息

    1.进入流程中心-工作流-流程设计中心 2.新增物料管理冻结流程 3.进入修改配置项 4.新消息节点 5.写入消息标题,内容等 6.填入接收人 7.保存后发布 8.进入流程配置中心 9.捆绑并启用 1 ...

随机推荐

  1. C#结束Explorer进程

    private void Form1_Load(object sender, EventArgs e) { Process[] processes = Process.GetProcesses();/ ...

  2. 取得Linux系统的各种统计信息

    本文基于Linux 2.6.x内核 一.取得CPU信息(相关文件/proc/stat) 在一个系统中的/proct/stat文件内容如下 $ cat /proc/stat cpu 1039426 17 ...

  3. 探索JS引擎工作原理 (转)

    这篇文章从相对底层的角度介绍了js引擎的工作 引入了 静态作用域 执行环境上下文(context) 等概念 , http://www.cnblogs.com/onepixel/p/5090799.ht ...

  4. php设置cookie和删除cookie

    设置cookie Example : - set - <?php setcookie( "name", "value", "future_tim ...

  5. Project Euler 14 Longest Collatz sequence

    题意:对于任意一个数 N ,寻找在 100,0000 之内按照规则( N 为奇数 N = N * 3 + 1 ,N 为偶数 N = N / 2 ,直到 N = 1 时的步数 )步数的最大值 思路:记忆 ...

  6. 使用Requests+正则表达式爬取猫眼TOP100电影并保存到文件或MongoDB,并下载图片

    需要着重学习的地方:(1)爬取分页数据时,url链接的构建(2)保存json格式数据到文件,中文显示问题(3)线程池的使用(4)正则表达式的写法(5)根据图片url链接下载图片并保存(6)MongoD ...

  7. web前端对文件的引用规则

    web前端一般常用文件 .html .css .js.但是当用css文件和html引入资源(比如图片)时,路径可能不相同.下面总结了几条. 使用相对路径引入规则: html或者js引入图片,按照htm ...

  8. assound.conf

    pcm.!dmix {type dmixipc_key 5678293ipc_key_add_uid yesslave {pcm "hw:0,0"period_time 0peri ...

  9. (7)JPA - Hibernate【从零开始学Spring Boot】

    在说具体如何在spring boot 使用Hibernate前,先抛装引玉些知识点?什么是JPA呢? JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述对象- ...

  10. 计算机网络系统--TCP/IP OSI模型