<pre name="code" class="objc">//MyOperation.h
#import <Foundation/Foundation.h> @interface MyOperation : NSOperation @property(copy,atomic)NSString*name; @end
#import "MyOperation.h" @implementation MyOperation -(void)main { NSLog(@" %@ 线程开始执行任务",self.name); NSLog(@"----------------"); for (int i=0; i<20; i++) { NSLog(@" %d ",i); } NSLog(@"%@任务执行完毕",self.name); } @end
// ProgressOperation.h // 10 OperationQueue // // Created by Tracy on 15/5/29. // Copyright (c) 2015年 Tracy. All rights reserved. // #import <Foundation/Foundation.h> #import "ViewController.h" @interface ProgressOperation : NSOperation @property(strong)ViewController *delegate; @end
// <span style="font-family: monospace; white-space: pre; background-color: rgb(240,240,240);">//</span><span style="white-space: pre;">ViewController.h</span> // ProgressOperation.m // 10 OperationQueue // // Created by Tracy on 15/5/29. // Copyright (c) 2015年 Tracy. All rights reserved. // #import "ProgressOperation.h" @implementation ProgressOperation -(void)main { for (int i=0; i<50; i++) { // 主线程中更新UI [self performSelectorOnMainThread:@selector(updateUI) withObject:nil waitUntilDone:YES]; } } -(void)updateUI { [NSThread sleepForTimeInterval:0.02f]; self.delegate.progressView.progress+=0.01; // self.delegate.progressView.progress+=0.01; } @end
<span style="font-family: monospace; white-space: pre; background-color: rgb(240,240);">//</span><span style="white-space: pre;">ViewController.h</span>
#import <UIKit/UIKit.h> @interface ViewController : UIViewController @property (strong,nonatomic) IBOutlet UIProgressView *progressView; @end
#import "ViewController.h" #import "MyOperation.h" #import "ProgressOperation.h" #import "backAccount.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view,typically from a nib. } - (IBAction)threeOperationQueue:(UIButton *)sender { MyOperation*op1=[[MyOperation alloc]init]; op1.name=@"1"; MyOperation *op2=[[MyOperation alloc]init]; op2.name=@"2"; MyOperation *op3=[[MyOperation alloc]init]; op3.name=@"3"; NSOperationQueue*queue=[[NSOperationQueue alloc]init]; // queue.maxConcurrentOperationCount=1; // //// 改变优先级需要在放入队列前完成 // [op3 setQueuePriority:NSOperationQueuePriorityVeryHigh]; // [op1 setQueuePriority:NSOperationQueuePriorityLow]; // //// 操作对象1依赖操作对象3,3完成后才执行1 // [op1 addDependency:op3]; [queue addOperation:op1]; [queue addOperation:op2]; [queue addOperation:op3]; } - (IBAction)updateProgressVew:(UIButton *)sender { ProgressOperation *po=[[ProgressOperation alloc]init]; po.delegate=self; NSOperationQueue *queue=[[NSOperationQueue alloc]init]; [queue addOperation:po]; } - (IBAction)fetchMoney:(UIButton *)sender { backAccount *hus=[[backAccount alloc]init]; hus.name=@"hus"; backAccount*wife=[[backAccount alloc]init]; wife.name=@"wife"; NSOperationQueue *queue=[[NSOperationQueue alloc ]init]; // 指定操作队列最大并行操作数量完成同步,此处设为1,相当于同步。避免取钱,买票等异步引起的问题。这行不能放在addoperation之后。 queue.maxConcurrentOperationCount=1; [queue addOperation:hus]; [queue addOperation:wife]; //NSOperation对象是一个single-shot(一次性)对象,(此处为hus,wife)当它执行完一遍后,便不能再次使用,下面代码出错! /*NSOperationQueue *operationQueue2 = [[NSOperationQueue alloc]init]; [operationQueue2 addOperation:husband]; [operationQueue2 addOperation:wife];*/ } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end
//
ViewController.h