zoukankan      html  css  js  c++  java
  • 多线程

    多线程

    分别尝试了以下几种多线程方式

    1、NSThread

    2、NSOperation

    3、NSOperationQueue

    4、GCD

    一、NSThread

    创建:

    1、//直接用方法开始:

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

    2、//先创建对象在开始:

    NSThread *myThread = [[NSThread alloc] initWithTarget:self selector:@selector(method:) object:nill];

    [myThread start];

    简单使用:[self performSelectorInBackground:@selector(doSomething) withObject:nil];

    更新UI须回到主线程中,可以通过:performSelectorOnMainThread来实现,或者用委托函数

    二、NSOperation

    [operation start]//开始线程

    [operation cancel];//取消线程

    //监听线程完毕后的操作(可用点语法)

    [operation setCompletionBlock = ^(){

    NSLog(@“执行完毕”);

    }];

    //是否是同步还是异步执行。默认是 NO,即同步执行

    [operation isConcurrent];

    创建线程

    NSOperation主要包括三种:1、NSInvocationOperation 2、NSBlockOperation 3、自定义NSOperation

    1、NSInvocationOperation

    NSInvocationOperation *operation = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(doSomething) object:nil];

    2、NSBlockOperation

    //一个Operation中是并行操作的

    //创建Operation

    NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^(){

    }];

    //增加一个并行线程

    [operation addExecutionBlock:^(){

    }];

    3、自定义NSOperation

    定义非并发操作时重载main函数

    定义并发操作时重载。

    main函数中每次要执行操作是都要判断一次isCancelled函数

    三、NSOperationQueue

    NSOperation *queue = [NSOperation alloc]init];

    [queue setMaxConcurrentOperationCount:2]//设置最大并发数

    [queue addOperation:operation1];

    [queue addOperation:operation2];

    //当operation2执行完了才执行operation1

    [operation1 addDependency:operation2];

    //主线程

    [NSOperationQueue main] addOperation ^{

    };

    [[NSOperationQueue main] addOperation:op3];

    四、GCD(Grand Central Dispatch)

    串行:按顺序执行

    并行:并发执行,无顺序执行

    同步操作:dispatch_sync,不开新线程

    异步操作:dispatch_async,开辟新线程。

    串行+异步:常用,开新线程,顺序执行任务(下载耗时任务)

    并行+异步:有用,开新线程,无序执行任务

    串行+同步:无用,不开线程,顺序执行任务

    并行+同步:无用,不开线程,无序执行任务

    全局队列:系统自带的一个并行队列

    主队列:主线程执行的队列,实际上是一个串行队列

    1、新建队列

    //新建串行队列

    //第一个参数是queue标签,用于debug,第二个参数为0

    dispatch_queue_t queue = dispatch_queue_create(“ThreadName”,0);

    //新建并行队列(global全局队列)

    dispatch_queue_t queue = dispatch_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);

    //DISPATCH_QUEUE_PRIORITY_HIGH(高),DISPATCH_QUEUE_PRIORITY_DEFAULT(普通),DISPATCH_QUEUE_PRIORITY_LOW(低),DISPATCH_QUEUE_PRIORITY_BACKGROUND(后台)

    //新建主线程

    dispatch_queue_t queue = dispatch_get_main_queue();

    2、添加任务

    //添加异步任务(第一个参数是要添加的队列名,第二个参数是要添加的代码块)

    //该方法添加完队列,不会等待队列完成就开始执行任务

    dispatch_async(queue,^{

    doSomething;

    });

    dispatch_async_f();

    //添加同步任务

    //等待队列中的任务完成再继续执行

    dispatch_sync(queue,^{

    doSomething;

    });

    dispatch_sync_f();

    3、组应用

    dispatch_group_t = dispatch_group_create();

    dispatch_group_async(group,queue,^{

    doSomething;

    })

    //在组中等待,组织当前线程继续执行

    dispatch_group_wait(group,DISPATCH_TIME_FOREVER);

  • 相关阅读:
    python变量赋值(可变与不可变)
    cx_Oracle读取中文乱码问题(转载)
    Lookandsay sequence(看读序列)
    oracle 效率之 not in 和exists
    python encode和decode函数说明
    PILpython的图像处理模块
    iOS中判断一个文件夹是否存在
    Validate Email Account using Regular Expression in ObjectiveC
    UILabel描边
    获取app当前可用的剩余内存
  • 原文地址:https://www.cnblogs.com/durwards/p/4574894.html
Copyright © 2011-2022 走看看