多线程之NSOperation:
多线程的优点:
- 使用线程可以把占据时间长的程序中的任务呀放到后台去处理
- 用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度
- 程序的运行速度可能加快
- 在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下可以释放一些珍贵的资源如内存占用等等。
多线程的缺点:
- 如果有大量的线程,会影响性能,因为操作系统需要在它们之间切换。
- 更多的线程需要更多的内存空间。
- 线程可能会给程序带来更多“bug”,因此要小心使用。
- 线程的中止需要考虑其对程序运行的影响。
- 通常块模型数据是在多个线程间共享的,需要防止线程死锁情况的发生。
使用NSOperation和NSOperationQueue实现多线程
- 创建NSOperation
- 把创建的NSOperation对象方法添加到NSOperationQueue中
- 系统自动去NSOperationQueue操作队列中取到一个NSOperation对象,并开启一个分线程去执行操作
注意:
- NSOperation是一个抽象类,不具备创建对象的能力。
- 我们可以使用NSOperation的子类去创建对象(NSInvocationOperation, NSBlockOperation)
- 我们也可以自定义NSOperation
NSInvocationOperation
NSInvocationOperation *operation = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(operationText) object:nil];
[operation start];
NSInvocationOperation创建的对象默认实在主线程中执行。
NSInvocationOperation *operation1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(operationText) object:nil];
NSInvocationOperation *operation2 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(operationText) object:nil];
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
[queue addOperation:operation1];
[queue addOperation:operation2];
将操作放入队列中,在分线程中执行。
[queue setMaxConcurrentOperationCount:5];
队列以此可以最多执行的分线程。超出,则先执行完,在执行多余的。
NSBlockOperation
NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{
[NSThread sleepForTimeInterval:5];
NSLog(@"方法 :%d",[NSThread isMainThread]);
}];
[operation2 start];
NSBlockOperation创建的对象默认是在主线程中执行的。
NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{
[NSThread sleepForTimeInterval:5];
NSLog(@"方法 :%d",[NSThread isMainThread]);
}];
[operation2 addExecutionBlock:^{
[NSThread sleepForTimeInterval:5];
NSLog(@"方法1 :%d",[NSThread isMainThread]);
}];
[operation2 start]
我们可以在block中添加其它任务,其它任务正常情况下是在分线程中执行。
NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"方法1 :%d",[NSThread isMainThread]);
}];
NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"方法2 :%d",[NSThread isMainThread]);
}];
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
[queue addOperation:operation1];
[queue addOperation:operation2];
这样创建的方法都在分线程中执行。
自定义NSOperation对象
我们需要创建一个类,继承自NSOperation.
在类中实现-(void)main(){//实现的内容}
myOperation *operation1 = [[myOperation alloc]init];
myOperation *operation2 = [[myOperation alloc]init];
myOperation *operation3 = [[myOperation alloc]init];
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
[queue addOperation:operation1];
[queue addOperation:operation2];
[queue addOperation:operation3];
我们可以设定操作对象的执行顺序。
- 通过依赖关系
- 通过优先级
[operation1 addDependency:operation2];
operation1依赖operation2,先执行operation2,再执行operation1
[operation3 setQueuePriority:NSOperationQueuePriorityHigh];
设置operation3的优先级
取消操作
[operation1 cancel];
取消某个操作。
[queue cancelAllOperations];
取消队列中的所有操作。
暂停操作
[queue setSuspended:YES];
[queue setSuspended:NO];