博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS NSMachPort 线程与进程间的通信
阅读量:2347 次
发布时间:2019-05-10

本文共 4273 字,大约阅读时间需要 14 分钟。

原创:

iOS线程间的通信

iOS中,两个线程之间要想互相通信,可以使用:NSMachPort 

下面是例子

#define kMsg1 100#define kMsg2 101- (void)viewDidLoad {    [super viewDidLoad];    //1. 创建主线程的port    // 子线程通过此端口发送消息给主线程    NSPort *myPort = [NSMachPort port];    //2. 设置port的代理回调对象    myPort.delegate = self;    //3. 把port加入runloop,接收port消息    [[NSRunLoop currentRunLoop] addPort:myPort forMode:NSDefaultRunLoopMode];    NSLog(@"---myport %@", myPort);    //4. 启动次线程,并传入主线程的port    MyWorkerClass *work = [[MyWorkerClass alloc] init];    [NSThread detachNewThreadSelector:@selector(launchThreadWithPort:)                             toTarget:work                           withObject:myPort];}- (void)handlePortMessage:(NSMessagePort*)message{    NSLog(@"接到子线程传递的消息!%@",message);    //1. 消息id    NSUInteger msgId = [[message valueForKeyPath:@"msgid"] integerValue];    //2. 当前主线程的port    NSPort *localPort = [message valueForKeyPath:@"localPort"];    //3. 接收到消息的port(来自其他线程)    NSPort *remotePort = [message valueForKeyPath:@"remotePort"];    if (msgId == kMsg1)    {        //向子线的port发送消息        [remotePort sendBeforeDate:[NSDate date]                             msgid:kMsg2                        components:nil                              from:localPort                          reserved:0];    } else if (msgId == kMsg2){        NSLog(@"操作2....\n");    }}
  • MyWorkerClass
#import "MyWorkerClass.h"@interface MyWorkerClass() 
{ NSPort *remotePort; NSPort *myPort;}@end#define kMsg1 100#define kMsg2 101@implementation MyWorkerClass- (void)launchThreadWithPort:(NSPort *)port { @autoreleasepool { //1. 保存主线程传入的port remotePort = port; //2. 设置子线程名字 [[NSThread currentThread] setName:@"MyWorkerClassThread"]; //3. 开启runloop [[NSRunLoop currentRunLoop] run]; //4. 创建自己port myPort = [NSPort port]; //5. myPort.delegate = self; //6. 将自己的port添加到runloop //作用1、防止runloop执行完毕之后推出 //作用2、接收主线程发送过来的port消息 [[NSRunLoop currentRunLoop] addPort:myPort forMode:NSDefaultRunLoopMode]; //7. 完成向主线程port发送消息 [self sendPortMessage]; }}/** * 完成向主线程发送port消息 */- (void)sendPortMessage { NSMutableArray *array =[[NSMutableArray alloc]initWithArray:@[@"1",@"2"]]; //发送消息到主线程,操作1 [remotePort sendBeforeDate:[NSDate date] msgid:kMsg1 components:array from:myPort reserved:0]; //发送消息到主线程,操作2 // [remotePort sendBeforeDate:[NSDate date] // msgid:kMsg2 // components:nil // from:myPort // reserved:0];}#pragma mark - NSPortDelegate/** * 接收到主线程port消息 */- (void)handlePortMessage:(NSPortMessage *)message{ NSLog(@"接收到父线程的消息...\n"); // unsigned int msgid = [message msgid]; // NSPort* distantPort = nil; // // if (msgid == kCheckinMessage) // { // distantPort = [message sendPort]; // // } // else if(msgid == kExitMessage) // { // CFRunLoopStop((__bridge CFRunLoopRef)[NSRunLoop currentRunLoop]); // }}@end
  • 以上就可以完成一个线程间的数据通信。

iOS进程间的通信(越狱时用到)

先创建一个命令行工程,建一个简单的子项目。名为:taskchild

#import 
#import
#include
int main (int argc, const char * argv[]){ NSLog(@"receive value arg %d %s %s", argc, argv[0], argv[1]); sleep(10); // insert code here... printf("Hello, World!\n"); NSLog(@"Hello, World"); return 0;}
  • 再创建一个有界面的主项目。进程通信部分代码。需要引用头文件:NSTask.h见下面的引用
NSString* string = [[NSBundle mainBundle] pathForResource:@"taskchild" ofType:nil];//taskchild是所要启动的名字二进制文件名,上面建的子项目。    NSLog(@"%@",string);    NSTask *task;    task = [[NSTask alloc ]init];    [task setLaunchPath:string];    NSLog(@"This is NSTask with ping command......\n");    NSArray *arguments;    arguments = [NSArray arrayWithObjects:@"22", nil];    [task setArguments:arguments];    NSPipe *pipe;    pipe = [NSPipe pipe];    [task setStandardOutput:pipe];    NSFileHandle *file;    file = [pipe fileHandleForReading];    [task launch];    NSData *data;    data = [file readDataToEndOfFile];    string = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];    NSLog(@"get child value :%@",string);

引用

 

转载地址:http://vlxvb.baihongyu.com/

你可能感兴趣的文章
VS2010 MFC CString转为char *或char[] 网上都不靠谱,自己写了一个牛的。
查看>>
js匹配url地址中参数 支持中文
查看>>
JS页面滚动动态加载数据,页面下拉自动加载内容
查看>>
被嵌套到iframe里面强制跳转方法,防止强制跳转方法
查看>>
有源码但后台密码忘记找回通用方法--微信猜骰子大小附带充值接口 html5游戏网站
查看>>
创业或业余赚大钱无风险:从支付宝赚赏钱开始,gitchat写文章或写课程1篇文章几千元
查看>>
百度经验很难通过且不能改标题 的方法:被谢绝无修改按键重新提交 ,还能自由改标题
查看>>
百度文库搜索0下载券文档的方法:删除VIP这段代码就行。
查看>>
android studio导入以module形式的源码 有人源码USR-BLE100蓝牙低功耗调试助手USR_ble_sound No resource found that matches
查看>>
学霸是怎样炼成的?学了那么多还一无是处?如何克服学习阻力?一件枯燥讨厌的事但必须要做?内心强大的主观改造 自我加速(学以致用)与环境加速(学习型组织)
查看>>
2019规划:放下所有,轻松上阵,大胆尝试,勇于实践,经商赚钱,考证提高,随时煅炼
查看>>
挑战昨天:如果每天都能打破昨天的记录,那是不是能充分挖掘潜力。
查看>>
小孩终生教育工程(人生管理):有些东西比努力比钱更重要
查看>>
kindle出现电池感叹号,充电黄灯亮,怎么解决?按AWZ客服的回复弄好了。
查看>>
关于婚姻
查看>>
java复习一
查看>>
JAVA复习 2数据类型
查看>>
java复习 3运算符
查看>>
java复习 4流程控制
查看>>
Java Review 包package
查看>>