// // ZYOperationViewController.h // Thread // // Created by yejiong on 14
// // ZYOperation.h // Thread // // Created by yejiong on 14/11/4. // Copyright © 2014年 zzz. All rights reserved. // #import <Foundation/Foundation.h> @interface ZYOperation : NSOperation @property (nonatomic, copy) NSString* operationName; @end
// // ZYOperation.m // Thread // // Created by yejiong on 14/11/4. // Copyright © 2014年 zzz. All rights reserved. // #import "ZYOperation.h" @implementation ZYOperation - (void)dealloc { [_operationName release]; [super dealloc]; } //重写 main 方法,在这里写入我们需要在线程中执行的代码。 - (void)main { // NSLog(@"--------%@", [NSThread currentThread]); // // if ([NSThread isMainThread]) { // NSLog(@"主线程"); // }else { // NSLog(@"分线程"); // } NSLog(@"%@", _operationName); } @end
/11/4. // Copyright © 2014年 zzz. All rights reserved. // #import <UIKit/UIKit.h> @interface ZYOperationViewController : UIViewController @end
// // ZYOperationViewController.m // Thread // // Created by yejiong on 14/11/4. // Copyright © 2014年 zzz. All rights reserved. // #import "ZYOperationViewController.h" #import "ZYOperation.h" @interface ZYOperationViewController () { NSOperationQueue* _operationQueue; } @property (nonatomic, retain) NSBlockOperation* blockOperation1; @end @implementation ZYOperationViewController - (void)dealloc { [_operationQueue release]; [_blockOperation1 release]; [super dealloc]; } - (void)viewDidLoad { self.view.backgroundColor = [UIColor whiteColor]; _operationQueue = [[NSOperationQueue alloc] init]; //设置最大并发数,同时最多有多少线程在执行。 _operationQueue.maxConcurrentOperationCount = 3; //使用 NSBlockOperation 的时候需要注意是否造成循环引用。 __block ZYOperationViewController* blockSelf = self; self.blockOperation1 = [NSBlockOperation blockOperationWithBlock:^{ blockSelf.view.backgroundColor = [UIColor redColor]; }]; //没有造成循环引用。 NSBlockOperation* blockOperation = [NSBlockOperation blockOperationWithBlock:^{ self.view.backgroundColor = [UIColor redColor]; }]; } - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { //NSOperation 是一个抽象类,我们不能使用它的对象,必须使用它子类的对象。 //系统提供了两个子类:NSInvocationOperation,NSBlockOperation。 //我们也可以自定义 NSOperation 子类,重写 mian 方法,然后把 operation 对象添加到 NSOperationQueue 中,就会自动在分线程执行 main 方法。 // [self invocationOperation]; // [self blockOperation];
//自定义 [self customOperation]; } - (void)invocationOperation { NSInvocationOperation* invocationOperation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(run:) object:@"123"]; //使用 start 在主线程执行任务。 // [invocationOperation start]; //如果需要在分线程执行任务,把对象添加到 NSOperationQueue,就会自动的在分线程执行任务。 [_operationQueue addOperation:invocationOperation]; [invocationOperation release]; } - (void)blockOperation { NSBlockOperation* blockOperation = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"1--------%@", [NSThread currentThread]); if ([NSThread isMainThread]) { NSLog(@"主线程"); }else { NSLog(@"分线程"); } }]; //主线程 // [blockOperation start]; //分线程 // [_operationQueue addOperation:blockOperation]; [blockOperation addExecutionBlock:^{ NSLog(@"2--------%@", [NSThread currentThread]); if ([NSThread isMainThread]) { NSLog(@"主线程"); }else { NSLog(@"分线程"); } }]; [blockOperation addExecutionBlock:^{ NSLog(@"3--------%@", [NSThread currentThread]); if ([NSThread isMainThread]) { NSLog(@"主线程"); }else { NSLog(@"分线程"); } }]; [blockOperation addExecutionBlock:^{ NSLog(@"4--------%@", [NSThread currentThread]); if ([NSThread isMainThread]) { NSLog(@"主线程"); }else { NSLog(@"分线程"); } }]; [blockOperation addExecutionBlock:^{ NSLog(@"5--------%@", [NSThread currentThread]); if ([NSThread isMainThread]) { NSLog(@"主线程"); }else { NSLog(@"分线程"); } }]; //addExecutionBlock,并发的执行多个 block 任务,系统自动分配到当前空闲的线程,可能是主线程也可能是分线程。 // [blockOperation start]; //全部在分线程并发执行。 [_operationQueue addOperation:blockOperation]; } - (void)customOperation { ZYOperation* operation = [[ZYOperation alloc] init]; operation.operationName = @"1111"; ZYOperation* operation1 = [[ZYOperation alloc] init]; operation1.operationName = @"2222"; ZYOperation* operation2 = [[ZYOperation alloc] init]; operation2.operationName = @"3333"; //设置线程间的依赖关系。让一个线程等待另外一个线程执行完毕再开始执行。 [operation addDependency:operation1]; [_operationQueue addOperation:operation]; [_operationQueue addOperation:operation1]; [_operationQueue addOperation:operation2]; [operation release]; [operation1 release]; [operation2 release]; } - (void)run:(id)object { NSLog(@"%@", object); if ([NSThread isMainThread]) { NSLog(@"主线程"); }else { NSLog(@"分线程"); } //仍然使用这个方法回到主线程。 // self performSelectorOnMainThread:<#(nonnull SEL)#> withObject:<#(nullable id)#> waitUntilDone:<#(BOOL)#> } @end