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

iOS-多线程(2)

2015-09-28 15:15 567 查看

多线程之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];
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: