博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Swift - 多线程实现方式(2) - NSOperation和NSOperationQueue
阅读量:5918 次
发布时间:2019-06-19

本文共 2437 字,大约阅读时间需要 8 分钟。

1,Swift继续使用Object-C原有的一套线程,包括三种多线程编程技术:

(1)NSThread
(2)Cocoa NSOperation(NSOperation和NSOperationQueue)
(3)Grand Central Dispath(GCD)

2,本文着重介绍Cocoa NSOperation
Cocoa NSOperation不需要关心线程管理和数据同步的事情,可以把精力放在自己需要执行的操作上。相关的类有NSOperation和 NSOperationQueue。其中NSOperation是个抽象类,使用它必须用它的子类,可以实现它或者使用它定义好的子 类:NSBlockOperation。创建NSOperation子类的对象,把对象添加到NSOperationQueue队列里执行。
3,使用NSOperation的两种方式
(1)直接用定义好的子类:NSBlockOperation。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import
UIKit
 
class
ViewController
:
UIViewController
{
 
    
override
func
viewDidLoad() {
        
super
.viewDidLoad()
         
        
var
operation:
NSBlockOperation
=
NSBlockOperation
(block: { [
weak
self
]
in
            
self
?.downloadImage()
            
return
        
})
         
        
//创建一个NSOperationQueue实例并添加operation
        
var
queue:
NSOperationQueue
=
NSOperationQueue
()
        
queue.addOperation(operation)
    
}
     
    
//定义一个下载图片的方法,线程调用
    
func
downloadImage(){
        
var
imageUrl =
""
        
var
data =
NSData
(contentsOfURL:
NSURL
(string: imageUrl)!, options:
nil
, error:
nil
)
        
println
(data?.length)
    
}
     
    
override
func
didReceiveMemoryWarning() {
        
super
.didReceiveMemoryWarning()
        
// Dispose of any resources that can be recreated.
    
}
}

(2)继承NSOperation 

然后把NSOperation子类的对象放入NSOperationQueue队列中,一旦这个对象被加入到队列,队列就开始处理这个对象,直到这个对象的所有操作完成,然后它被队列释放。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import
UIKit
 
class
ViewController
:
UIViewController
{
 
    
override
func
viewDidLoad() {
        
super
.viewDidLoad()
         
        
//创建线程对象
        
var
downloadImageOperation:
DownloadImageOperation
=
DownloadImageOperation
()
         
        
//创建一个NSOperationQueue实例并添加operation
        
var
queue:
NSOperationQueue
=
NSOperationQueue
()
        
queue.addOperation(downloadImageOperation)
    
}  
    
override
func
didReceiveMemoryWarning() {
        
super
.didReceiveMemoryWarning()
    
}
}
 
class
DownloadImageOperation
:
NSOperation
{
    
override
func
main(){
        
var
imageUrl =
""
        
var
data =
NSData
(contentsOfURL:
NSURL
(string: imageUrl)!, options:
nil
, error:
nil
)
        
println
(data?.length)
    
}
}

4,设置运行队列并发数 

NSOperationQueue队列里可以加入很多个NSOperation,可以把NSOperationQueue看做一个线程池,可往线程池中添加操作(NSOperation)到队列中。
可以设置线程池中的线程数,也就是并发操作数。默认情况下是-1,-1表示没有限制,这样可以同时运行队列中的全部操作。
1
2
//设置并发数
queue.maxConcurrentOperationCount = 5

5,取消队列所有操作

1
2
//取消所有线程操作
queue.cancelAllOperations()

6,每个NSOperation完成都会有一个回调表示任务结束

1
2
3
4
5
6
7
//定义一个回调
var
completionBlock:(() ->
Void
)?
//给operation设置回调
operation.completionBlock = completionBlock
dispatch_after(dispatch_time(
DISPATCH_TIME_NOW
, 4), dispatch_get_main_queue(), {
    
println
(
"Complete"
)
})

转载地址:http://mdfvx.baihongyu.com/

你可能感兴趣的文章
SVN多版本库环境的搭建
查看>>
idea无法下载插件问题
查看>>
PHP+APACHE开发环境搭建
查看>>
阿里系产品Xposed Hook检测机制原理分析
查看>>
Spring Boot 之事件(Event)
查看>>
python中的可变参数
查看>>
【第三节】CSS基础整理
查看>>
java Jedis连接池的使用
查看>>
前端框架layer.open ios不支持弹出页面滚动条
查看>>
拦截器
查看>>
go-xorm使用外键报错(Cannot add or update a child row: a foreign key constraint fails)
查看>>
HttpServlet请求响应过程(继承HttpServlet类的Servlet,Tomcat容器)
查看>>
为什么防火墙不能保护网络免受ddos攻击
查看>>
认识CoreData - 基础使用
查看>>
深入理解Solidity之源文件及合约结构——Solidity中文文档(4)
查看>>
拥抱大健康,瞄准第一股
查看>>
pyhanlp 停用词与用户自定义词典功能详解
查看>>
比特币交易费用创新低的背后:交易量下降了68%
查看>>
前端自动化构建工具webpack简单入门——2
查看>>
MySQL面试题--常见的四种隔离级别
查看>>