IOS 多线程/GCD

多线程  —单利

+ (SingleHandel *)shareModel

{

static dispatch_once_t onceQueue;

dispatch_once(&onceQueue, ^{

shareSingle = [[SingleHandel alloc] init];

});

return shareSingle;

}

/* //第一种线程开启方式

NSThread *thread1 = [[NSThread alloc] initWithTarget:self selector:@selector(threadAction) object:nil];

//给你的线程起个名字

thread1.name = @"thread1";

//启动线程

[thread1 start];

//关闭

[thread1 cancel];*/

//第二种线程开启方式(程序运行的时候自动开启线程)

/*[NSThread detachNewThreadSelector:@selector(threadAction) toTarget:self withObject:nil];*/

//第三种继承与NSObjet

//    [self performSelectorInBackground:@selector(threadAction) withObject:nil];

//    NSOperation

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

NSBlockOperation *blockOp = [NSBlockOperation blockOperationWithBlock:^{

NSLog(@"我是block");

}];

//    [blockOp start];

//创建队列

NSOperationQueue *queue = [[NSOperationQueue alloc] init];

//设置最大同时执行数量

queue.maxConcurrentOperationCount = 1;

//添加事件

[queue addOperation:inOp];

//    sleep(1);

[queue addOperation:blockOp];

}

- (void)invocation

{

//    NSLog(@"%@",[NSThread currentThread]);

NSLog(@"我是方法");

}

/-----------------------------------------------------GCD----------------------------------------------------------------/

多线程---GCD

- (IBAction)buttonAction:(id)sender

{

//GCD(先进先出first in first out 简称FIFO)

//串行 前一个执行完成之后,后一个任务才能执行

//并行 任务在派发时时有序的,不用等到第一个任务执行完成才开始下一个(也就是一块执行)

//GCD分为三种:主队列,全局队列,自定义队列

/*--------------------主队列(串行)----------------------*/

//使用主队列实现任务派发(串行),在主线程中

/*dispatch_queue_t mainQueue = dispatch_get_main_queue();

//添加任务

dispatch_async(mainQueue, ^{

NSLog(@"第一个任务%@",[NSThread currentThread]);

});

dispatch_async(mainQueue, ^{

NSLog(@"第二个任务:%@",[NSThread currentThread]);

});

dispatch_async(mainQueue, ^{

NSLog(@"第三个任务:%@",[NSThread currentThread]);

});*/

/*--------------------自定义队列(串行)----------------------*/

//自定义队列

/* dispatch_queue_t myQueue = dispatch_queue_create("com.myqueue", DISPATCH_QUEUE_SERIAL);

//添加任务

dispatch_async(myQueue, ^{

NSLog(@"第一个任务%@",[NSThread currentThread]);

});

dispatch_async(myQueue, ^{

sleep(3);

NSLog(@"第二个任务:%@",[NSThread currentThread]);

});

dispatch_async(myQueue, ^{

NSLog(@"第三个任务:%@",[NSThread currentThread]);

});*/

/*--------------------自定义队列(并行)----------------------*/

/* dispatch_queue_t myqueue1 = dispatch_queue_create("com.s", DISPATCH_QUEUE_CONCURRENT);

dispatch_async(myqueue1, ^{

NSLog(@"第一个任务%@",[NSThread currentThread]);

});

dispatch_async(myqueue1, ^{

//可以延时

sleep(3);

NSLog(@"第二个任务%@",[NSThread currentThread]);

});

dispatch_async(myqueue1, ^{

NSLog(@"第三个任务%@",[NSThread currentThread]);

});*/

/*--------------------全局队列(并行)----------------------*/

/* dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_async(globalQueue, ^{

sleep(2);

NSLog(@"第一个任务:%@",[NSThread currentThread]);

});

dispatch_async(globalQueue, ^{

NSLog(@"第二个任务:%@",[NSThread currentThread]);

});

dispatch_async(globalQueue, ^{

NSLog(@"第三个任务:%@",[NSThread currentThread]);

});*/

/*---------------------------------延时---------------------------------------------*/

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(4 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

[self afther];

});

/*-----------------------------重复执行---------------------------------------------*/

dispatch_apply(3, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(size_t t) {

[self afther];

});

/*-----------------------------执行一次---------------------------------------------*/

static dispatch_once_t onceQueue ;

dispatch_once(&onceQueue, ^{

NSLog(@"我就执行一次");

});

/*----------------------------------线程通讯---------------------------------*/

//遇到线程通讯,执行他的方法,可以回到主线程(如果正在执行子线程,走这个方法可以跳出子线程到主线程)

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

}

- (void)newThread

{

NSLog(@"我是子线程");

//回到主线程

[self performSelectorOnMainThread:@selector(afther) withObject:self waitUntilDone:NO];

}

-(void)afther

{

NSLog(@"sad");

}

时间: 2024-10-11 22:48:56

IOS 多线程/GCD的相关文章

iOS多线程 GCD

iOS多线程 GCD Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法. dispatch queue分成以下三种: 1)运行在主线程的Main queue,通过dispatch_get_main_queue获取. /*! * @function dispatch_get_main_queue * * @abstract * Returns the default queue that is bound to the main thread. *

iOS多线程GCD

Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法. dispatch queue分成以下三种: 1)运行在主线程的Main queue,通过dispatch_get_main_queue获取. /*! * @function dispatch_get_main_queue * * @abstract * Returns the default queue that is bound to the main thread. * * @discussi

深入IOS多线程 GCD(一)

一,什么是GCD GCD是异步执行任务的技术之一,一般将应用程序中记述的线程管理用的代码在系统级中实现.开发者只需要定义想执行的任务并追加到适当的dispatch queue中,GCD就能生成必要的线程并计划执行任务.由于线程管理师作为系统的一部分来实现的,因此可统一管理,也可执行任务,这样就比以前的线程更有效率. 也就是说GCD用我们难以置信的非常简单的记述方法,实现了极为复杂的多线程编程,可以说这是一项划时代的技术.下面是使用了GCD源码的例子,虽然稍微抽象,但从中也能感受到GCD的威力 d

IOS 多线程GCD的使用[转载于新浪微博, 原作者:太阳石]

原文 在红黑联盟上看到一篇关于多线程GCD的教程文章,写的深入浅出,特转载于此,以备不时之需.原文链接另:补充两个GCD代码,都是Xcode snippet里面提供的:1.Dispatch After主要用于延迟执行一些代码.例子: int64_t delayInSeconds = 1.0; dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); dispatch_aft

iOS 多线程GCD的基本使用

<iOS多线程简介>中提到:GCD中有2个核心概念:1.任务(执行什么操作)2.队列(用来存放任务) 那么多线程GCD的基本使用有哪些呢? 可以分以下多种情况: 1.异步函数 + 并发队列 /** * 异步函数 + 并发队列:可以同时开启多条线程 */ - (void)asyncConcurrent { // 1.创建一个并发队列 // dispatch_queue_create(const char *label, dispatch_queue_attr_t attr); // label

iOS 多线程 GCD part3:API

https://www.jianshu.com/p/072111f5889d 2017.03.05 22:54* 字数 1667 阅读 88评论 0喜欢 1 0. 预备知识 GCD对时间的描述有些新奇 #define NSEC_PER_SEC 1000000000ull #define NSEC_PER_MSEC 1000000ull #define USEC_PER_SEC 1000000ull #define NSEC_PER_USEC 1000ull MSEC:毫秒 USEC:微秒 NSE

iOS多线程——GCD篇

什么是GCD GCD是苹果对多线程编程做的一套新的抽象基于C语言层的API,结合Block简化了多线程的操作,使得我们对线程操作能够更加的安全高效. 在GCD出现之前Cocoa框架提供了NSObject类的 performSelectorInBackground:withObject performSelectorOnMainThread 方法来简化多线程编程技术. GCD可以解决以下多线程编程中经常出现的问题:1.数据竞争(比如同时更新一个内存地址) 2.死锁(互相等待) 3.太多线程导致消耗

iOS多线程GCD的简单使用

在iOS开发中,苹果提供了三种多线程技术,分别是: (1)NSThread (2)NSOperation (3)GCD 简单介绍一下GCD的使用. GCD全称 Grand Central Dispatch,可以称之为大中央调度.实际上GCD是管理着一个线程池,如何创建线程,如何回收线程,以及分配多少个线程,这些都是GCD来控制的.在开发中,程序员是不用操作线程的相关事情,程序员只需要把应该做的操作放到相应的队列里面即可. 一:自定义队列 GCD中有多种队列,其中自定义的队列有两种:串行队列和并行

ios多线程-GCD基本用法

ios中多线程有三种,NSTread, NSOperation,GCD 这篇就讲讲GCD的基本用法 平时比较多使用和看到的是: dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ //异步操作代码块 dispatch_async(dispatch_get_main_queue(), ^{ //回到主线程操作代码块 }); }); 比较多的用于更新ui操作 比如从数据库获取数据需要花较长的

关于ios多线程GCD的简单介绍

很久没写博客了,实在太忙了,没有时间写.现在终于空闲下来了,今天就给大家介绍下ios开发里GCD的用法. 刚开始学习的新手,或许对多线程很迷茫,那么什么是线程呢?其实很简单,不要想那么复杂. 1.我们通常知道进程,就是正在执行中的程序,每个进程有自己独立的内存空间,进程之间互相不干涉.(就比如你打开微信) 2.什么是线程?线程是进程执行的基本单元.进程中的任务是在线程中执行的,进程在启动后会自动蜕化为主线程(ios UI Main thread),然后在执行任务. 3.线程的串航执行,比如我要下