您的位置:首页 > 移动开发 > IOS开发

iOS多线程编程之NSOperation

2016-04-12 16:57 483 查看
多线程编程之NSOperation类
一、 基本了解

1、 NSOperation类是一个抽象类(不能直接使用),其子类有NSBlockOperation和NSInvocationOperation,(swift中取消,因为不安全)及自定义NSOperation的子类(继承是需要实现其Main方法)

2、 NSOperation 和NSOperationQueue 分别对应 GCD 的任务 和 队列

二、 操作步骤

1、 创建NSOperation同时将要执行的任务封装到一个 NSOperation 对象中。

2、 将此任务添加到一个 NSOperationQueue 对象中(开始时需要创建一个队列)。

3、 NSOperationQueue自动取出队列中任务对象,放在线程中执行

注意:

a、当Operation有多个任务时回自动分配对个线程并发执行,只有一个任务则会在主线程同步执行。

b、添加到队列中任务将自动异步执行

扩展:

a、通过使用Operation的addExcutionBlock方法可以添加多个任务

b、可以使用OperationQueue的addOperationWithBlock{block}直接将Block添加到队列

c、OperationQueue对象中有一个参数:MaxConcurrentOperationCount可以设置最大并发数(如果需要串行,设置为1即可)

三、 NSOperation操作依赖

依赖:当前一个操作执行之后,后一个操作才能执行。如获打开文件与读写文件。

实现:在创建好的Operation对象中使用addDependency(后一个操作)方法即可。

示例代码:

//创建队列

let queue =NSOperationQueue()

let operationA =NSBlockOperation { () -> Void in

print("printA")

}

let operationB =NSBlockOperation { () -> Void in

print("printB")

}

let operationC =NSBlockOperation { () -> Void in

print("print C")

}

///先完成依赖

//B等A执行完才执行

operationB.addDependency(operationA)

//C等B执行完才执行

operationC.addDependency(operationB)

//在将任务添加到队列中

queue.addOperation(operationA)

queue.addOperation(operationB)

queue.addOperation(operationC)

注意:不要设置循环依赖或者死等依赖

四、 NSOperation操作调用(函数)

可以在一个任务操作中调用另一个操作,使用ConpletionBlock

示例代码如下:

//创建队列

let queue =NSOperationQueue()

let operation =NSBlockOperation { () -> Void in

print("printA")

}

operation.completionBlock = doSomething

queue.addOperation(operation)

}

func doSomething(){

print("doSomething")

}

五、 线程通信

在子线程中嵌套主线程()即可

示例代码:

/创建队列

let queue =NSOperationQueue()

queue.addOperationWithBlock { () -> Void in

print("子线程 \(NSThread.currentThread())")

NSOperationQueue.mainQueue().addOperationWithBlock({ () -> Void in

print("主线程 \(NSThread.currentThread())")

})

}

问题:swift中有抽象类吗?NSOperation在swift中是抽象类吗?

详细内容参考:swift多线程NSOperation使用

简书-关于IOS多线程,你看我就够了

实例:推酷-在Swift中使用NSOperation和NSOperationQueue
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: