美文网首页
10.7 OC - 多线程的使用技巧

10.7 OC - 多线程的使用技巧

作者: 没有北方的南方 | 来源:发表于2016-10-07 20:27 被阅读64次

    多线程使用技巧(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 - 多线程的使用技巧

          本文链接:https://www.haomeiwen.com/subject/yxoyyttx.html