iOS详解多线程(实现篇——其他方式)

在之前的章节中,我们详细探究了多线程的相关概念、常用的实现方式(NSThread、GCD、NSOpreation),不常用的方式pThread。那么,iOS中,还有没有别的方式实现多线程呢?嘿嘿···你别说,还真有呢。

相关链接:
pThread链接:iOS详解多线程(实现篇——pThread)
NSOpreation链接:iOS详解多线程(实现篇——NSOperation)
GCD链接:iOS详解多线程(实现篇——GCD)
NSThread链接:详解多线程(实现篇——NSThread)
多线程概念篇链接:详解多线程(概念篇——进程、线程以及多线程原理)

源码链接:https://github.com/weiman152/Multithreading.git

多线程的实现方法

1.NSThread(OC)
2.GCD(C语言)
3.NSOperation(OC)
4.C语言的pthread(C语言)

5.其他实现多线程方法
1. 后台执行多线程
-(void)run {
    NSLog(@"开始任务,%@",[NSThread currentThread]);
}

//后台开启多线程
- (IBAction)test1:(id)sender {
    [self performSelectorInBackground:@selector(run) withObject:nil];
}

运行结果:



performSelectorInBackground这个方法定义在NSObject的分类NSThreadPerformAdditions中,如下图:



任何继承自NSObject的类都可以使用这个方法,快速在后台开启线程。

2. 子线程与主线程切换
- (IBAction)test2:(id)sender {
    NSThread * t1 = [[NSThread alloc] initWithBlock:^{
        NSLog(@"哈哈哈,%@",[NSThread currentThread]);
        [self performSelector:@selector(run) onThread:[NSThread mainThread] withObject:nil waitUntilDone:NO];
    }];
    t1.name = @"线程一";
    [t1 start];
    
}

打印结果:


或者使用performSelectorOnMainThread也可以回到主线程执行任务。

NSThread * t2 = [[NSThread alloc] initWithBlock:^{
        NSLog(@"呵呵呵,%@",[NSThread currentThread]);
        [self performSelectorOnMainThread:@selector(run) withObject:nil waitUntilDone:NO];
    }];
    t2.name = @"线程二";
    [t2 start];
}
3. 在指定子线程执行某方法
-(void)run {
    NSLog(@"开始任务,%@",[NSThread currentThread]);
}

- (IBAction)test2:(id)sender {
    NSThread * t1 = [[NSThread alloc] initWithBlock:^{
        NSLog(@"哈哈哈,%@",[NSThread currentThread]);
        [[NSRunLoop currentRunLoop] run];
    }];
    t1.name = @"线程一";
    [t1 start];
    [self performSelector:@selector(run) onThread:t1 withObject:nil waitUntilDone:NO];
}

打印结果:


上述案例中,我们创建了一个子线程叫做线程一,我们想指定线程一中执行我们的方法run,又不想把方法写在子线程里面,这个时候就可以使用 [self performSelector:@selector(run) onThread:t1 withObject:nil waitUntilDone:NO];这个方法了。

本节内容对多线程的实现进行一个小小的补充,主要是performSelector的一些方法,有的时候还是很有用的。只是使用performSelector的时候要注意,此方法在编译的时候并不会检查方法的有效性,可能会造成一些崩溃问题,要做检查才安全哟。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章