iOS多线程系统整理 swift

多线程   是一个应用程序内多个代码的执行路径,执行线程,同时在同一时间里执行不同的任务。

三种:

1、NSTread

2、Cocoa NSOperation (NSOperation,NSOperationQueue)

3、GrandCentralDispatch:GCD



1\NSTread

相对最简单,需要自己管理线程的生命周期和线程同步(加锁会有一定的系统开销)

两种应用方式:

需要传递三个参数:

selector:线程执行方法""

target:方法所在的对象

argument:传递给方法的参数,可选nil

一、直接创建线程,自动运行线程

// Class Method

class func detachNewThreadSelector(selector:Selector,toTarget target:AnyObject,withObject argument:AnyObject?)

二、先创建一个线程对象,手动运行线程,在运行之前可设置线程优先级等信息。

convenience init(target:AnyObject,selector:Selector,object argument:AnyObject?)

for example

// download image method

func downloadImage()

{

var imageUrl = "https://www.baidu.com/img/bdlogo.png"

var data = NSData.dataWithContentsOfURL(NSURL.URLWithString(imageUrl),options:nil,error:nil)

println(data.length)

}

override func viewDidLoad(){

super.viewDidLoad()

// 第一种方式

NSThread.detachNewThreadSelector("downloadImage",toTarget:self,withObject:nil)

// 第二种方式

var downloadImageThread = NSThread(target:self,selector:"downloadImage",object:nil)

dowloadImageThread.start()

}

线程同步,通过锁来实现,每个线程有一个锁,锁 与 特定的线程关联。

for example

// 定义两个线程

var thread1,thread2:NSThread?

// 线程条件

let condition1 = NSCodition()

let condition2 = NSCodition()

// two method for thread

func method1(sender: AnyObject)

{

  for var i = 0; i <10; i++

  {

  println("thread 1 running \(i)")

  sleep(1)

  if i == 2

  {

  thread2!.start()

// lock

condition1.lock()

condition1.wait()

condition1.unlock()

  }

  }

println(thread 1 over)

//

condition2.signal()

}

//

func method2(sender:AnyObject)

{

  for var i=0;i<10;i++

  {

  println("thread 2 running \(i)")

  sleep(1)

  if i ==2

  {

//  active thread 1

  condition1.signal()

// lock

condition2.lock()

condition2.wait()// stop waitting

condition2.unlock()

  }

  }

println("thread 2 over")

}

// RUN

thread2 = NSThread (target:self , selector:"method2:",object:nil)

thread1 = NSThread(target:self,selector:"method1",object:nil)

控制台输出

thread 1 running 0

thread 1 running 1

thread 1 running 2

thread 2 running 0

thread 2 running 1

thread 2 running 2

thread 1 running 3

thread 1 running 4

thread 1 running 5

thread 1 running 6

thread 1 running 7

thread 1 running 8

thread 1 running 9

thread 1 over

thread 2 running 3

thread 2 running 4

thread 2 running 5

thread 2 running 6

thread 2 running 7

thread 2 running 8

thread 2 running 9

线程1 2是同步关系,启动2,挂起 1,激活1,挂起2,有效避免了线程1占用一个资源时,引起线程2不能访问的问题。



NSOperation 两种方式

一  两个子类 NSInvocationOperation   NSBlockOperation

// creat instance

var operation = NSInvocationOperation(target:self,selector:"dowloadImage",object:nil)

var queue = NSOperationQueue()

queue.addOperation(operation)

后台建立一个线程

Queue队列中可以加入很多个operation 可以把它看做是一个线程池子,可以设置线程池中的线程数,即并发操作数。

默认是:-1,-1表示没有限制,同时运行队列中的全部操作。

queue.maxConcurrentOperationCount = 6

// ervery operation come to an end

var completionBlock:(()->Void)?

operation.completionBlock = completionBlock

dispatch_after(dispatch_time(DISPATCH_TIME_NOW,4),dispatch_get_main_queue(),{println("complete")})

// cancell

queue.cancelAllOperations()

二  继承NSOperation   把子类的对象放到NSOperationQueue队列中 ,一旦加入,就处理这个,直到操作完成,队列被释放。

// creat DrinkOperation.swift 继承 NSOperation   且  实现main方法

import UIKit

class DrinkOperation:NSOperation{

  override func main()

  {

  println("drink")

  }

}

// e.g.

// creat a  instance

var queue1 = NSOperationQueue()

// creat a operation

var drinkOperation = DrinkOperation()

// add

queue1.addOperation(drinkOperation)



Grand Central Dispatch

多核编程

底层也是用线程实现,queue可以接受任务,先到先执行顺序来执行,也可以并发或串行执行。

同步或异步

优点多多:基于C,融入面向对象,Block,易用,性能上自动根据系统负载来增减线程数量,无需加锁。

三种方法:

一 自己创建队列

func dispatch_queue_create(label:UnsafePointer<Int8>,attr:dispation_queue_attr_t!)->dispatch_queue_t!

label:参数代表队列名称,可以任意名

DISPATCH_QUEUE_CONCURRENT  并行

DISPATCH_QUEUE_SERIAL 串行

//e.g.

var serialQueue = dispatch_queue_create("serialQueue_1",DISPATCH_QUEUE_SERIAL)

var concurrentQueue = dispatch_queue_create("concurrentQueue_1",DISPATCH_QUEUE_CONCURRENT)

二  获取系统的全局队列

func dispatch_get_global_queue(identifier:Int,flags:UInt)->dispatch_gueue_t!

参数 identifier   执行优先级  ,4个优先级

DISPATCH_QUEUE_PRIORITY_HIGH

DISPATCH_QUEUE_PRIORITY_DEFAULT

DISPATCH_QUEUE_PRIORITY_LOW

DISPATCH_QUEUE_PRIORITY_BACKGROUND    非常低的有相机,用于不太关心的后台任务

// e.g.

var globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0)

三 在主线程的Main dispatch queue

在主线程里执行的队列(只有一个主线程)

一切跟UI相关的操作都放到主线程中执行

func dispatch_get_main_queue()->dispatch_queue_t!

// e.g.

var mainQueue = dispatch_get_main_queue()



追加任务到队里的  两个方法:
一 dispatch_async  异步追加Block

async = asynchronous 异步

func dispatch_async(queue:dispatch_queue_t!,block:dispatch_block_t!)

第一个参数:GCD队列
第二个参数:block

// e.g.

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),{()->Void in

//  耗时代码块

//执行完  调用主线程刷新界面

dispatch_async(dispatch_get_main_queue(),{()->Void in

//通知主线程刷新

})

})

二 dispatch_sync 同步追加Block

与之前相反,block结束之前,dispatch_sync会一直等待,等待队列前面的所有任务完成后才执行追加的任务。

func dispatch_sync()

// e.g.

dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),{()->Void in

println("sync1")

})

加到 global_queue异步队列中,不会造成锁死,但会一直等待代码执行完毕。

如果加到main_queue中,在主线程中添加任务操作,就会引起死锁。

// e.g.

dispatch_sync(dispatch_get_main_queue(),{()->Void in

print("sync2")

})



暂停和继续执行队列

func  dispatch_suspend() 暂停

func dispatch_resume() 继续

suspend  使 suspension reference count +1

resume    -1

count>0  queue就保持挂起状态

如果挂起了  一个 queue   或者  source    那么销毁他之前,先对其进行恢复。

var concurrentQueue = dispatch_queue_create("concurrentQueue_1",DISPATCH_QUEUE_CONCURRENT)

// stop

dispatch_suspend(concurrentQueue)

// go on

dispatch_resume(concurrentQueue)

只执行一次 用于单例

dispatch_once

延时:指定时间后把任务追加到 dispatch queue里面

dispatch_after

func dispatch_time(when:XX,delta:Int64)->dispatch_time_t

delta单位非常小,到秒要乘以  NSEC_PER_SEC

let deltaT = 2.0 *Double(NSEC_PER_SEC)

let  dTime =dispatch_time(DISPATCH_TIME_NOW,Int64(deltaT))

dispatch_after(dTime,dispatch_get_global-global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0)

{()->Viod in

println("延时2秒执行")

})

多个任务都结束的一个全部结束:dispatch_barrier_async

当执行任务更新数据时,会出现数据不一样的情况。

for i in 1...100

{

dispatch_async(queue,{()->Void in

println("\(i)")

})

}

虽然使用dispatch_barrier_async可以避免

但是有另一方法,  semaphore 信号量

var semaphore = dispatch_semaphore_creat(1)//初始值为1

for i in 1...100

{

dispatch_async(queue,{()->Void in

dispatch_semaphore_wait(semaphore,DISPATCH_TIME_FOREVER)

println("\(i)")

dispatch_semaphore_signal(semaphore)

})

}

时间: 2024-11-15 08:53:04

iOS多线程系统整理 swift的相关文章

iOS-多线程 ,整理集锦,多种线程的创建

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; //创建线程的第一种方式 NSThread *thread = [[NSThread all

关于iOS多线程的总结

关于iOS多线程的总结 在这篇文章中,我将为你整理一下 iOS 开发中几种多线程方案,以及其使用方法和注意事项.当然也会给出几种多线程的案例,在实际使用中感受它们的区别.还有一点需要说明的是,这篇文章将会使用 Swift 和 Objective-c 两种语言讲解,双语幼儿园.OK,let's begin! 概述 这篇文章中,我不会说多线程是什么.线程和进程的区别.多线程有什么用,当然我也不会说什么是串行.什么是并行等问题,这些我们应该都知道的. 在 iOS 中其实目前有 4 套多线程方案,他们分

【超齐全】iOS 学习资料整理

好赶货,收藏.原文iOS 学习资料整理 这份学习资料是为 iOS 初学者所准备的, 旨在帮助 iOS 初学者们快速找到适合自己的学习资料, 节省他们搜索资料的时间, 使他们更好的规划好自己的 iOS 学习路线, 更快的入门, 更准确的定位的目前所处的位置. 该文档会持续更新, 同时也欢迎更多具有丰富经验的 iOS 开发者将自己的常用的一些工具, 学习资料, 学习心得等分享上来, 我将定期筛选合并, 文档尚有一些不完善之处, 也请不吝指出, 感谢您对 iOS 所做的贡献, 让我们一起把国内的 iO

半年努力,我终于把这100家企业iOS面试题整理完了(附答案)!

####100家知名企业今年来iOS面试题合集: 你要的这里都有: 企业要的这里也有: 从基础开始到进阶.深入底层 整理出188个面试题,全是干货 这些全部是题目跟类目,每个题目都会有相对的答案,由于字数太多所以我整理出一个文档,文档获取地址,作者创建的iOS行业交流群:763164022,加群在群文件下载 ####目录展示: 1.swift和oc的区别2.编译链接3.synthesize & denamic4.在项目开发中常用的开发工具有哪些?5.UITableView & UIColl

iOS 学习资料整理

视频教程(英文) 视频 简介 Developing iOS 7 Apps for iPhone and iPad 斯坦福开放教程之一, 课程主要讲解了一些 iOS 开发工具和 API 以及 iOS SDK 的使用, 属于 iOS 基础视频 iPad and iPhone Application Development 该课程的讲师 Paul Hegarty 是斯坦福大学软件工程学教授, 视频内容讲解得深入, 权威, 深受好评 Advanced iPhone Development - Fall

OA01-一个Demo展示iOS多线程技术的基本应用场景

最近在看iOS关于GCD.NSOperation多线程编程技术编程指南的时候写了个 小Demo,以7个小场景基本涵盖多线程技术的主流用法:其实多线程技术早在大学 读书的时候,基本思路就已经清晰了,不同操作系统的多线程实现也大同小异,iOS 平台下原理也是一样,关键就在与,能否熟练的.很顺畅的根据应用场景来选用相应 的多线程技术.阅读苹果官方文档和一些别人写的博客的时候也依然有种隔靴捞痒的 感觉:书读百边,不如实践一遍啊,SO,尽管网上相关的博客一大堆(首推这篇: http://www.cocoa

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

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

iOS 多线程的使用

iOS 多线程 先看一篇阮一峰写关于进程和线程的文章,快速了解线程的相关概念. 随着现在计算机硬件的发展,多核心.高频率的cpu越来越普及,为了充分发挥cpu的性能,在不通的环境下实现cpu的利用最大化,多线程技术在这个时候显得越发重要.同时,在程序中合理的使用多线程,可以让程序变得更加有效.靠谱.所以学习这一知识是一项有意义的事情. iOS中,只有主线程跟Cocoa关联,也即是在这个线程中,更新UI总是有效的,如果在其他线程中更新UI有时候会成功,但可能失败.所以苹果要求开发者在主线程中更新U

iOS 多线程 浅述

什么是进程? 进程是指在系统中正在运行的一个应用程序. 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内. 什么是线程? 1个进程要想执行任务,必须得有线程(每1个进程至少要有1条线程). 线程是进程的基本执行单元,一个进程(程序)的所有任务都在线程中执行. 小拓展: - 线程的串行(就像烤串一样) - 1个线程中任务的执行是串行的. - 如果要在1个线程中执行多个任务,那么只能一个一个地按顺序执行这些任务. - 在`同一时间内`,1个线程只能执行1个任务. 什么是多线程? 1个