iOS线程开发小结

/*

方法名决定是否开启新线程(async,sync),队列类型(全局队列,串行队列)决定开启多少条线程

1.快速线程调用

*开启后台线程执行任务

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

*回到主线程执行任务

[self performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:YES];

2.GCD : 依赖队列执行

1> 队列类型

* 全局队列

* 所有添加到全局队列中的任务都是并发执行(同时执行,可能会开启多个线程)

* dispatch_get_global_queue

* 串行队列

* 所有添加到串行队列中的任务都是按顺序执行(开一条线程)

* dispatch_queue_create("myqueue", 0);

* 主队列

* 所有添加到主队列中的任务都是在主线程中执行的(跟方法名没有关系)

* dispatch_get_main_queue

2> 同步还是异步,取决于方法名(不影响主队列,影响全局队列、串行队列)

* 同步:dispatch_sync,在当前线程执行任务,不会开启新的线程

* 异步:dispatch_async,在其他线程执行任务,会开启新的线程

3.NSOperation\NSOperationQueue

1> 使用步骤

* 创建NSOperation

* 添加NSOperation到NSOperationQueue

2> 优点

* 更加面向对象

* 可以控制最大并发数  maxConcurrentOperationCount

* 添加任务(Operation)之间的依赖 addDependency

*/

#import "XMQViewController.h"

@interface XMQViewController ()

{

NSOperationQueue *_queue;

}

@end

@implementation XMQViewController

- (void)viewDidLoad

{

[super viewDidLoad];

_queue = [[NSOperationQueue alloc] init];

// 控制最大并发数,最多同时执行3条线程

_queue.maxConcurrentOperationCount = 3;

// 回到主线程

//    [self test];

// 线程监听

//    [self gcd_group];

// GCD线程依赖

//    [self gcd_barrier];

// 循环执行

[self gcd_apply];

// 全局队列

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

// 串行队列

//    dispatch_queue_t queue2 = dispatch_queue_create("myqueue", 0);

dispatch_async(queue, ^{ // 耗时操作

NSLog(@"这是一个异步线程---%@", [NSThread currentThread]);

});

}

- (IBAction)click

{

NSOperation *operation = [NSBlockOperation blockOperationWithBlock:^{

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

}];

NSOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{

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

}];

// 该方法默认在主线程执行

//    [operation start];

// 加入队列会在异步线程执行

[_queue addOperation:operation];

[_queue addOperation:operation2];

// 设置线程依赖 (operation2依赖于operation,operation执行完以后,才能执行operation2)

[operation addDependency:operation2];

}

// 延时执行某条线程

- (IBAction)click2

{

// 全局队列

//    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

// 串行队列

dispatch_queue_t queue2 = dispatch_queue_create("myqueue", 0);

double delayInSeconds = 5.0;

dispatch_time_t delayInNanoSeconds =dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);

dispatch_after(delayInNanoSeconds, queue2, ^{

NSLog(@"延迟执行");

});

}

// dispatch_group_async(异步方法)可以实现监听一组任务是否完成,完成后得到通知执行其他的操作(比如通知用户下载完成,显示UI等)

- (void)gcd_group

{

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_group_t group = dispatch_group_create();

dispatch_group_async(group, queue, ^{

[NSThread sleepForTimeInterval:1];

NSLog(@"group1");

});

dispatch_group_async(group, queue, ^{

[NSThread sleepForTimeInterval:2];

NSLog(@"group2");

});

dispatch_group_async(group, queue, ^{

[NSThread sleepForTimeInterval:3];

NSLog(@"group3");

});

dispatch_group_notify(group, dispatch_get_main_queue(), ^{

NSLog(@"updateUI");

});

}

// dispatch_barrier_async 是在前面的任务执行结束后才执行,而且后面的任务必须等它执行完成之后才会执行

- (void)gcd_barrier

{

dispatch_queue_t queue = dispatch_queue_create("myqueue", DISPATCH_QUEUE_CONCURRENT);

dispatch_async(queue, ^{

[NSThread sleepForTimeInterval:2];

NSLog(@"dispatch_async1");

});

dispatch_async(queue, ^{

[NSThread sleepForTimeInterval:4];

NSLog(@"dispatch_async2");

});

dispatch_barrier_async(queue, ^{

NSLog(@"dispatch_barrier_async");

[NSThread sleepForTimeInterval:4];

});

dispatch_async(queue, ^{

[NSThread sleepForTimeInterval:2];

NSLog(@"dispatch_async3");

});

}

// dispatch_apply 执行某个代码片段N次

- (void)gcd_apply

{

dispatch_queue_t queue = dispatch_queue_create("myqueue", DISPATCH_QUEUE_PRIORITY_DEFAULT);

dispatch_apply(10, queue, ^(size_t index) {

NSLog(@"循环执行10次");

});

}

// 回到主线程

- (void)test

{

UIImage *image = nil;

[self performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:YES];

dispatch_async(dispatch_get_main_queue(), ^{

NSLog(@"更新UI界面---%@", [NSThread currentThread]);

});

}

@end

iOS线程开发小结,布布扣,bubuko.com

时间: 2024-10-08 09:48:05

iOS线程开发小结的相关文章

iOS 地图开发小结

首先来说说ios地图开发使用的主要类: MKMapView:地图控件,无其他Label等控件无异,拖进来就可以用了,用于地图的内容的显示,用户可以对地图进行放大.缩小.拖动.旋转等操作: CLLocationCoordinate2D :坐标,包括经度和纬度: MKCoordinateSpan :地图跨度,表示地图放大倍数,数值越小地图显示的单位越精细: CLLocationManager :用户所在位置的管理类,通过该类的能够获取用户所在的GPS坐标. 下面与大家分享一些个人项目中地图部分所涉及

iOS线程开发总结

在iOS开发线程操作时,一般方法名决定是否开启新线程(async,sync),队列类型(全局队列,串行队列)决定开启多少条线程 1.快速线程调用 *开启后台线程执行任务 [self performSelectorInBackground:@selector(test) withObject:nil]; *回到主线程执行任务 [self performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:Y

iOS多线程开发小demo5 线程间的通信

// DYFViewController.m // 623-06-线程间的通信 // // Created by dyf on 14-6-23. // Copyright (c) 2014年 ___FULLUSERNAME___. All rights reserved. // #import "DYFViewController.h" @interface DYFViewController () @property (weak, nonatomic) IBOutlet UIImag

iOS多线程开发小demo4,线程的同步问题

// DYFViewController.m // 623-05-线程同步问题 // // Created by dyf on 14-6-23. // Copyright (c) 2014年 ___FULLUSERNAME___. All rights reserved. // #import "DYFViewController.h" @interface DYFViewController () @property (nonatomic, assign) int leftCount

iOS多线程开发小demo3,线程的状态

// Created by dyf on 14-6-23. // Copyright (c) 2014年 ___FULLUSERNAME___. All rights reserved. // #import "DYFViewController.h" @interface DYFViewController () @property (nonatomic, strong) NSThread *thread; @end @implementation DYFViewController

iOS多线程开发小demo

首先演示一下主线程的阻塞 // DYFViewController.m // 623-01-阻塞多线程 // // Created by dyf on 14-6-23. // Copyright (c) 2014年 ___FULLUSERNAME___. All rights reserved. // #import "DYFViewController.h" @interface DYFViewController () @end @implementation DYFViewCon

iOS多线程开发——NSThread浅析

在IOS开发中,多线程的实现方式主要有三种,NSThread.NSOperation和GCD,我前面博客中对NSOperation和GCD有了较为详细的实现,可以参考<iOS多线程开发--NSOperation/NSOperationQueue浅析><iOS多线程开发--GCD的使用与多线程开发浅析>.以及对于多线程中的同步异步,并行串行等概念,我在<GCD实践--串行队列/并发队列与iOS多线程详解>中也有较为详细的讲解.为了学习的完整性,今天我们主要从代码层面来实现

web前端开发与iOS终端开发的异同[转]

* {-webkit-tap-highlight-color: rgba(0,0,0,0);}html {-webkit-text-size-adjust: none;}body {font-family: Arial, Helvetica, sans-serif;margin: 0;color: #333;word-wrap: break-word;}h1, h2, h3, h4, h5, h6 {line-height: 1.1;}img {max-width: 100% !importan

iOS性能优化小结

iOS性能优化分析 首先要熟悉几个概念 PNG 和 JPG 的区别是什么? png格式的图片有alpha通道,jpeg则没有.png无损压缩,jpeg允许你选择0-100%的压缩质量.如果需要alpha通道(透明),就只能用png格式. CPU 和 GPU 如果想看看两者的区别,先得了解iOS视图背后的层级结构原理  上图中的最底下一行是硬件层,由GPU和CPU组成. 我们经常说到的硬件加速其实是指OpenGL,Core Animation/UIKit基于GPU之上对计算机图形合成以及绘制的实现