使用nsport线程通信iOS线程通信和进程通信的例子(NSMachPort和NSTask,NSPipe)

#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.h:

#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

你可能感兴趣的:(使用nsport线程通信iOS线程通信和进程通信的例子(NSMachPort和NSTask,NSPipe))