10.7 OC - 多线程的使用技巧

多线程使用技巧(NSTheard/NSOperationQueue/GCD)

NSTheard

[NSThread isMainThread];可以用来判断是否在主线程上执行。

创建一个,然后在子线程上执行。

[NSThread detachNewThreadSelector:@selector(download) toTarget:self withObject:nil];

NSObject中封装的线程调用方法

[self performSelectorInBackground:@selector(download) withObject:nil];
[self performSelectorOnMainThread:<#(nonnull SEL)#> withObject:<#(nullable id)#> waitUntilDone:<#(BOOL)#>];

NSOperationQueue

1.创建一个队列后,直接添加一个执行闭包,闭包中的任务在子线程进行。

2.可以定义子线程的最大数,即可控制执行速度,还可以取消尚未执行的任务。

    //子线程
    NSOperationQueue *queue = [NSOperationQueue new];
    [queue addOperationWithBlock:^{
        NSLog(@"he");
        for (NSInteger i = 0; i<100; i++) {
            queue.maxConcurrentOperationCount = 2;
            [queue addOperationWithBlock:^{
                NSLog(@"---->%ld",i);
                [queue cancelAllOperations];
            }];
            
        }
        
    }];

    //主线程
    NSLog(@"we");

dispatch

串行和并行:串行会卡住线程(用来描述线程)

同步和异步:(调用方法的方式)

主要使用:

  • dispatch_queue_t mainqueue = dispatch_get_main_queue();
    dispatch_queue_t subqueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

  • dispatch_async(<#dispatch_queue_t queue#>, <#^(void)block#>)

  • dispatch_sync(<#dispatch_queue_t queue#>, <#^(void)block#>)

  • dispatch_group_notify

  • dispatch_barrier_async

  • dispatch_group_enter

  • dispatch_group_leave

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
#if 0
    //定义主队列和子队列(队列会自动管理线程)
    dispatch_queue_t mainqueue = dispatch_get_main_queue();
    dispatch_queue_t subqueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    for (NSInteger i = 0; i<100; i++) {
        //异步方法
        dispatch_async(subqueue, ^{
            NSLog(@"---->%ld",i);
        });
        NSLog(@"hello the world");
    }
    NSLog(@"主线程");
#endif
    
    NSLog(@"主线程");
    //串行队列中的方法既可以同步执行也可以异步执行

    //串行队列
//    dispatch_queue_t myqueue = dispatch_queue_create("test.queue", DISPATCH_QUEUE_SERIAL);
    //当前队列是主队列的时候,使用同步执行会造成死锁(少用同步方法!)
//    myqueue = dispatch_get_main_queue();
#if 0
    //同步方法,只有闭包中的任务完成后,才会执行后面的任务,(都是在主线程中进行)
    dispatch_sync(myqueue, ^{
        NSLog(@"hello");
    });
    NSLog(@"world");

    //异步方法,闭包中的方法不知道什么时候执行,但是并不会影响后面的任务,闭包中的任务在子线程执行
    dispatch_async(myqueue, ^{
        NSLog(@"hey man");
    });
    NSLog(@"you are good");
#endif
    
#if 0
    //当前队列不是主队列的时候,默认异步执行方法都是在子进程中,多个异步方法在同一子进程中
    dispatch_async(myqueue, ^{
        NSLog(@"-->1");
    });
    
    dispatch_async(myqueue, ^{
        NSLog(@"-->2");
    });
    
    dispatch_async(myqueue, ^{
        NSLog(@"-->3");
    });
    
    NSLog(@"finished");
#endif
    
#if 0
    dispatch_async(myqueue, ^{
        
        NSLog(@"1");
    });
    
    dispatch_async(myqueue, ^{
        
        NSLog(@"2");
    });
    //barrier在异步执行完之前的任务后,再执行某一个方法,再异步执行之后的方法
    dispatch_barrier_async(myqueue, ^{
        
        NSLog(@"barrier");
    });
    
    dispatch_async(myqueue, ^{
        
        NSLog(@"3");
    });
    
    
    dispatch_async(myqueue, ^{
        
        NSLog(@"4");
    });
#endif
    
    dispatch_group_t group = dispatch_group_create();
    //创建并行队列,异步执行,在不同的子线程
    dispatch_queue_t myqueue = dispatch_queue_create("myqueue", DISPATCH_QUEUE_CONCURRENT);
    
    dispatch_group_async(group, myqueue, ^{
        
        NSLog(@"1");
    });
    
    dispatch_group_async(group, myqueue, ^{
        
        NSLog(@"2");
    });
    //监听异步执行是否完成,完成后执行某一个方法
    dispatch_group_notify(group, myqueue, ^{
        
        NSLog(@"done");
    });
    
    //当异步执行中嵌套有异步执行的方法时,采用dispatch_group_enter/dispatch_group_leave来监听嵌套中的任务是否完成
    dispatch_group_async(group, myqueue, ^{
        dispatch_group_enter(group);
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            NSLog(@"5");
        });
        dispatch_group_leave(group);
        NSLog(@"hello");
    });
    
    dispatch_group_async(group, myqueue, ^{
        
        NSLog(@"3");
    });
    
    dispatch_group_async(group, myqueue, ^{
        
        NSLog(@"4");
    });
    
}
@end

你可能感兴趣的:(10.7 OC - 多线程的使用技巧)