UIview只能在主线程里 自定义一个线程时要重写- (void)main 添加到非主队列里的操作都并发执行,且都在子线程 // // ViewController.m // ThreadApp // // Created by apple on 14-9-11. // Copyright (c) 2014年 戴维营教育. All rights reserved. // #import "ViewController.h" @interface ViewController () - (IBAction)didClick:(id)sender; @property (weak, nonatomic) IBOutlet UILabel *label; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // [self download:nil]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } //1. 线程有独立的栈空间 //2. 执行顺序随机 - (IBAction)didClick:(id)sender { static int i = 0; // [NSThread sleepForTimeInterval:10]; i++; [self performSelectorInBackground:@selector(download:) withObject:@(i)]; i++; //*** [self performSelectorInBackground:@selector(download:) withObject:@(i)]; // [NSURLConnection sendAsynchronousRequest:<#(NSURLRequest *)#> queue:<#(NSOperationQueue *)#> completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { // <#code#> // }]; } - (void)download:(id)object { // NSLog(@"----starting----"); // NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://class.room/tinghai.mp3"]]; // NSLog(@"%lu", data.length); for (int i = 0; i < 100000; i++) { NSLog(@"%@: %d", object, i); // _label.text = [NSString stringWithFormat:@"%d", i]; NSString *str = [NSString stringWithFormat:@"%d", i]; //在主线程中执行setText方法 //******* // [_label performSelectorOnMainThread:@selector(setText:) withObject:str waitUntilDone:YES]; // [self performSelectorOnMainThread:@selector(setText:) withObject:str waitUntilDone:YES]; [self performSelector:@selector(setText:) onThread:[NSThread mainThread] withObject:str waitUntilDone:YES modes:@[NSDefaultRunLoopMode]]; NSLog(@"...."); } } - (void)setText:(NSString *)text { _label.text = text; //**** NSLog(@"%@", [NSThread isMainThread]?@"Main Thread":@"Not Main Thread"); } @end // // ViewController.m // ThreadApp2 // // Created by apple on 14-9-11. // Copyright (c) 2014年 戴维营教育. All rights reserved. // #import "ViewController.h" #import "MyThread.h" #import "Downloader.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; //1. 创建子线程 // [self performSelectorInBackground:<#(SEL)#> withObject:<#(id)#>]; //2. 创建了一个新的子线程 // [NSThread detachNewThreadSelector:@selector(print) toTarget:self withObject:nil]; //3. 通过创建NSThread对象的方式实现多线程 // NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(print) object:nil]; // [thread start]; // [thread cancel]; //4. 继承NSThread // MyThread *thread = [[MyThread alloc] init]; // [thread start]; Downloader *downloader = [[Downloader alloc] init]; downloader.path = @"http://class.room/tinghai.mp3"; downloader.completionHandler = ^(NSData *data){ NSLog(@"download completion: %lu", data.length); NSLog(@"%@", [NSThread isMainThread]?@"Main":@"Not"); }; [downloader start]; } - (void)print { NSLog(@"%@", [NSThread isMainThread]?@"Main":@"Not Main"); } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end //操作线程 // // ViewController.m // NSOperation-0911 // // Created by apple on 14-9-11. // Copyright (c) 2014年 apple. All rights reserved. // #import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; //默认为主线程 // NSInvocationOperation *invOper=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(print:) object:nil]; // [invOper start]; //fangfaQianMing // NSMethodSignature *methSignt=[self methodSignatureForSelector:@selector(print:obj2:)]; // //方法调用 // NSInvocation *invocation=[NSInvocation invocationWithMethodSignature:methSignt]; // [invocation setTarget:self]; // [invocation setSelector:@selector(print:obj2:)]; // // //设置参数 // NSString *str=@"abc"; // NSNumber *num=@122; // [invocation setArgument:&str atIndex:2]; // [invocation setArgument:&num atIndex:3]; // //调用方法 // [invocation invoke]; // NSInvocationOperation *invocationOper=[[NSInvocationOperation alloc]initWithInvocation:invocation]; // [invocationOper start]; // NSBlockOperation *blockOper=[NSBlockOperation blockOperationWithBlock:^{ // NSLog(@"----%@",[NSThread isMainThread]?@"IS":@"NO"); // }]; // // [blockOper addExecutionBlock:^{ // NSLog(@"++==%@",[NSThread isMainThread]?@"IS":@"NO"); // }]; // // [blockOper start]; NSInvocationOperation *op1=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(print:) object:@1]; NSInvocationOperation *op2=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(print:) object:@2]; NSInvocationOperation *op3=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(print:) object:@3]; NSInvocationOperation *op4=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(print:) object:@4]; //执行操作,并发执行 // NSOperationQueue *queue=[[NSOperationQueue alloc]init]; //主队列可以保证都是在主线程 NSOperationQueue *queue=[NSOperationQueue mainQueue]; [queue addOperation:op1]; [queue addOperation:op2]; [queue addOperation:op4]; [queue addOperation:op3]; [queue addOperationWithBlock:^{ NSLog(@"%@",[NSThread isMainThread]?@"IS":@"NO"); }]; } - (void)print:(id)obj { NSLog(@"%@ %@",obj,[NSThread isMainThread]?@"IS":@"No"); } - (void)print:(id)object obj2:(id)object2 { NSLog(@"%@, %@,%@: %@", self,NSStringFromSelector(_cmd), object, object2); NSLog(@"%@", [NSThread isMainThread]?@"Main":@"Not"); } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end