iOS多线程编程之基础

多线程是为了解决主线程被阻塞,并提高效率的一种方式.

首先我们要学习多线程编程就要看看它有哪几种方式:

  1. NSThread
  2. NSOperation
  3. Grand Centeral Dispatch

我们看看NSThread的创建方式::

NSThread *thread = [[NSThread alloc]initWithTarget:self selector:@selector(btnSum:) object:nil];
    //通过iniit 创建NSThread 需要手动开启线程
    [thread start];
    [thread cancel];
    //第二种开启并自动执行 btnSum 是自己写的一个方法
    [NSThread detachNewThreadSelector:@selector(btnSum:) toTarget:self withObject:nil];
- (void)btnSum:(UIButton *)sender {
    
    long sum = 0;
    
    for (long i = 0; i < 10; i ++) {
        sum += i;
        NSLog(@"number %ld current Thred : %@  %@",sum,[NSThread currentThread],[NSOperationQueue currentQueue]);
        
    }
    
}

 使用NSThread 或直接从 NSObject 的类方法 performSelectorInBackground:withObject: 来创建一个线程。如果你选择thread来实现多线程,那么 NSThread 就是官方推荐优先选用的方式


NSOperation

/**
     NSOperationQueue线程队列
*/
//    1.NSInvocationOperation操作

    NSInvocationOperation *iOP =[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(btnSum:) object:nil];
    
    //Operation是不能执行的,需要队列进行调用
    [[NSOperationQueue mainQueue] addOperation:iOP];
    
    //2.NSBlockOperation
    
    NSBlockOperation *bOP = [[NSBlockOperation alloc]init];
   //以代码块的方式添加操作
    [bOP addExecutionBlock:^{
        [self btnSum:nil];
    }];
    
    //添加到线程队列
    [self.operationQueue addOperation:bOP];

为了创建一个简单的NSOperation对象,直接重写了getter方法

- (NSOperationQueue *)operationQueue{
    if (!_operationQueue ) {
        _operationQueue = [[NSOperationQueue alloc]init];
        [_operationQueue setName:@"queue"];
    }
    return _operationQueue;
}
//NSBlockOperation 创建方式,可以用便利构造器,直接添加block
    NSBlockOperation *bOP = [NSBlockOperation blockOperationWithBlock:^{
        for (int i = 0; i < 100; i ++) {
            NSLog(@"%d,当前线程:::%@",i,[NSThread currentThread]);
        }
    }];
    NSBlockOperation *aOP = [NSBlockOperation blockOperationWithBlock:^{
        for (int i = 0; i < 100; i ++) {
            NSLog(@"%d,当前线程:::%@",i,[NSThread currentThread]);
        }
    }];
    NSBlockOperation *cOP = [NSBlockOperation blockOperationWithBlock:^{
        for (int i = 0; i < 100; i ++) {
            NSLog(@"%d,当前线程333333333:::%@",i,[NSThread currentThread]);
        }
    }];
    //添加到主队列
    [[NSOperationQueue mainQueue] addOperation:bOP];
    [[NSOperationQueue mainQueue] addOperation:cOP];
//自定义队列
    self.operation = [[NSOperationQueue alloc]init];
    //设置最大并发数
    self.operation.maxConcurrentOperationCount = 1;//在同一连续时刻只执行一个操作
//    self.operation.maxConcurrentOperationCount = 4;
    
   [self performSelectorInBackground:@selector(printNumber:) withObject:@"NSObject"];
  
    [self.operation addOperation:aOP];
    [self.operation addOperation:cOP];

GCD

/**
GCD 中央派发机制 Grand Central Dispatch
 基于函数,使用分发队列FIFO
*/
    //1.主线程队列::等同于[NSOperationQueue mainQueue]
    //2.全局线程队列 后台队列  并行
    //3.自定义线程队列 DISPATCH_QUEUE_SERIAL 串行
//                   DISPATCH_QUEUE_CONCURRENT 并行
    /*
    //创建自定义队列,默认为串行(故加了个优先级的东东::DISPATCH_QUEUE_PRIORITY_DEFAULT)
    dispatch_queue_t myQueue = dispatch_queue_create("com.liulei.www.myQueue",DISPATCH_QUEUE_PRIORITY_DEFAULT);
    
//串行队列

    // dispatch_async(队列, 执行block) 异步
    // dispatch_sync(队列, 执行block)同步
    dispatch_async(myQueue, ^{
        [self printNumber:@"GCD"];
        [self printNumber:@"GCD1"];
    });
    
    
    dispatch_async(myQueue, ^{
        [self printNumber:@"GCD2"];
    });
    */
    /*
//并行队列
    dispatch_queue_t conQueue = dispatch_queue_create("conQueue", DISPATCH_QUEUE_CONCURRENT);
    
    //一个bolck中串行
    dispatch_async(conQueue, ^{
        //顺序执行
        [self printNumber:@"G1"];
        [self printNumber:@"G2"];
        [self printNumber:@"G3"];
    });
    //并行执行
    dispatch_async(conQueue, ^{
        
        [self printNumber:@"G4"];
    });
    
    dispatch_async(conQueue, ^{
        [self printNumber:@"G5"];
    });
    */
    //dispatch_after ..//延时操作

既然说道多线程的开发,难免会在多线程之间进行通讯;
利用NSObject的一些类方法,可以轻松搞定。(NSObject内置方法来创建线程)

在应用程序主线程中做事情:
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait

- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait modes:(NSArray *)array

在指定线程中做事情:
- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait

- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait modes:(NSArray *)array
在当前线程中做事情:
//Invokes a method of the receiver on the current thread using the default mode after a delay.
- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay

performSelector:withObject:afterDelay:inModes:

取消发送给当前线程的某个消息
cancelPreviousPerformRequestsWithTarget:

cancelPreviousPerformRequestsWithTarget:selector:object:

如在我们在某个线程中下载数据,下载完成之后要通知主线程中更新界面等等,可以使用如下接口:- 
[self performSelectorOnMainThread:@selector(updateUI) withObject:nil waitUntilDone:NO];
比如下载完成后,通知主线程(ui线程),以便app再做其他工作

时间: 2024-10-28 23:13:39

iOS多线程编程之基础的相关文章

线程同步-iOS多线程编程指南(四)-08-多线程

首页 编程指南 Grand Central Dispatch 基本概念 多核心的性能 Dispatch Sources 完结 外传:dispatch_once(上) Block非官方编程指南 基础 内存管理 揭开神秘面纱(上) 揭开神秘面纱(下) iOS多线程编程指南 关于多线程编程 线程管理 Run Loop 线程同步 附录 Core Animation编程指南 Core Animation简介 基本概念 渲染架构 几何变换 查看目录 中文手册/API ASIHTTPRequest Openg

iOS多线程编程

1. 进程,线程, 任务 进程:一个程序在运行时,系统会为其分配一个进程,用以管理他的一些资源. 线程:进程内所包含的一个或多个执行单元称为线程,线程一般情况下不持有资源,但可以使用其所在进程的资源. 任务:进程或线程中要做的事情. 在引入线程的操作系统中,通常把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位. 线程比进程更小,对其调度的开销小,能够提高系统内多个任务的并发执行程度. 一个程序至少有一个进程,一个进程至少有一个线程.一个程序就是一个进程,而一个程序中的多个任

iOS多线程编程(四)------ GCD(Grand Central Dispatch)

一.简介 是基于C语言开发的一套多线程开发机制,也是目前苹果官方推荐的多线程开发方法,用起来也最简单,只是它基于C语言开发,并不像NSOperation是面向对象的开发,而是完全面向过程的.如果使用GCD,完全由系统管理线程,我们不需要编写线程代码.只需定义想要执行的任务,然后添加到适当的调度队列(dispatch_queue).GCD会负责创建线程和调度你的任务,系统会直接提供线程管理. 二.任务和队列 GCD中有两个核心概念 (1)任务:执行什么操作 (2)队列:用来存放任务 GCD的使用就

iOS多线程编程Part 1/3 - NSThread &amp; Run Loop

iOS多线程编程Part 1/3 - NSThread & Run Loop 02 JUNE 2013 前言 多线程的价值无需赘述,对于App性能和用户体验都有着至关重要的意义,在iOS开发中,Apple提供了不同的技术支持多线程编程,除了跨平台的pthread之外,还提供了NSThread.NSOperationQueue.GCD等多线程技术,从本篇Blog开始介绍这几种多线程技术的细节. 对于pthread这种跨平台的多线程技术,这本Programming with POSIX Thread

多线程编程技术基础知识

GPS平台.网站建设.软件开发.系统运维,找森大网络科技!http://cnsendnet.taobao.com来自森大科技官方博客http://www.cnsendblog.com/index.php/?p=414 多线程编程技术基础知识 什么是进程? 当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源.而一个进程又是由多个线程所组成的. 什么是线程? 线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针.程序计数器等),但代码区是共享的,即不同

【转】iOS多线程编程技术之NSThread、Cocoa NSOperation、GCD

转自容芳志的博客 简介 iOS有三种多线程编程的技术,分别是: (一)NSThread (二)Cocoa NSOperation (三)GCD(全称:Grand Central Dispatch) 这三种编程方式从上到下,抽象度层次是从低到高的,抽象度越高的使用越简单,也是Apple最推荐使用的. 三种方式的优缺点介绍: 1)NSThread: 优点:NSThread 比其他两个轻量级 缺点:需要自己管理线程的生命周期,线程同步.线程同步对数据的加锁会有一定的系统开销 NSThread实现的技术

iOS多线程编程技术之NSThread、Cocoa NSOperation、GCD

简介iOS有三种多线程编程的技术,分别是:(一)NSThread(二)Cocoa NSOperation(三)GCD(全称:Grand Central Dispatch) 这三种编程方式从上到下,抽象度层次是从低到高的,抽象度越高的使用越简单,也是Apple最推荐使用的. 三种方式的优缺点介绍:1)NSThread:优点:NSThread 比其他两个轻量级缺点:需要自己管理线程的生命周期,线程同步.线程同步对数据的加锁会有一定的系统开销 NSThread实现的技术有下面三种:一般使用cocoa

iOS多线程编程的几种方式

一.线程概述 有些程序是一条直线,起点到终点——如简单的hello world,运行打印完,它的生命周期便结束了,像昙花一现. 有些程序是一个圆,知道循环将它切断——像操作系统,一直运行,直到你关机. 一个运行着的程序就是一个进程或者叫做一个任务,一个进程至少包含一个线程,线程就是程序的执行流. Mac和IOS中的程序启动,创建好一个进程的同时,一个线程便开始运作,这个线程叫做主线程.主线程在程序中的位置和其他线程不同,它是其他线程最终的父线程,且所有的界面的显示操作即AppKit或UIKit的

iOS多线程编程--NSOperation(转)

这篇文章写得非常不错,基础用法都涉及到了,我把文章提到的例子都写到了demo里面, 原文地址: iOS多线程--彻底学会多线程之『NSOperation』 demo下载:https://github.com/wangdachui/multithreading.git 1. NSOperation简介 NSOperation是苹果提供给我们的一套多线程解决方案.实际上NSOperation是基于GCD更高一层的封装,但是比GCD更简单易用.代码可读性也更高. NSOperation需要配合NSOp