昨天在项目中使用到了以前所没有使用过的线程,今天有时间来简单的学习一下。

 

一.线程的创建分为三种方法

  1. (id)init; // designated initializer  
  2. (id)initWithTarget:(id)target selector: (SEL)selector object:(id)argument; 

以上两种方法创建的线程方法,需要另外调用 “start”方法来启动该线程

 

  3.(void)detachNewThreadSelector:  (SEL)aSelector toTarget:  (id)aTarget withObject:  (id)anArgument 

而上面这种创建线程的方法,则不需要再额外调用其他方法来启动线程。

   4. [selfperformSelectorInBackground:@selector(threadAction) withObject:self];

  也不用调用启动方法。更多的使用县城方法,倾向于使用这种方式。

 

  5.NSOperationQueue *operationQueue = [[NSOperationQueuealloc]init];

    [operationQueue addOperationWithBlock:^{

        for (int i = 0; i < 30; i++) {

            NSLog(@"多线程:%d",i);

        }

    }];

  6.

//1.线程池:这个对象可设置线程执行优先级和线程并发数(同时段执行多少线程)

    NSOperationQueue *operationQueue = [[NSOperationQueuealloc]init];

    [operationQueue addOperationWithBlock:^{

        for (int i = 0; i < 30; i++) {

            NSLog(@"多线程:%d",i);

        }

    }];

    

    //设置并发数为1,线程池中同一时间只能执行一个线程

    operationQueue.maxConcurrentOperationCount = 1;

    

    NSInvocationOperation *operation1 = [[NSInvocationOperationalloc] initWithTarget:selfselector:@selector(operationAction1) object:nil];

    //设置线程的优先级

    [operation1 setQueuePriority:NSOperationQueuePriorityLow];

    NSInvocationOperation *operation2 = [[NSInvocationOperationalloc] initWithTarget:selfselector:@selector(operationAction1) object:nil];

    [operation2 setQueuePriority:NSOperationQueuePriorityHigh];

    

    //把线程添加进线程池中去

    [operationQueue addOperation:operation1];

    [operationQueue addOperation:operation2];

二:1。暂时遇到一个说法,更新UI必须得回到主线程。

暂时我不清楚这样的原因,并且什么情况,或者说怎么使用线程方法才是回到主线程,对于我来说还是一个迷。

  2。清楚的是,调用以下这个方法是回到主线程。(下面这个方法,也在很多情况下被用到,以此来回到主线程来更新UI)

用NSObject的类方法  performSelectorInBackground:withObject: 创建一个线程:
[Obj performSelectorInBackground:@selector(doSomething) withObject:nil];

 

三:下面这一段代码或许就是对问题二得一个合理得解释。利用一中得三类方法开得线程都不是主线程,所以在下面代码中,新开得线程方法里下载完图片之后,需要返回到主线程来更新UI。

//
// ViewController.m
// NSThreadDemo
//
// Created by rongfzh on 12-9-23.
// Copyright (c) 2012年 rongfzh. All rights reserved.
//

#import "ViewController.h"
#define kURL @"http://avatar.csdn.net/2/C/D/1_totogo2010.jpg"
@interface ViewController ()

@end

@implementation ViewController

-(void)downloadImage:(NSString *) url{
NSData *data = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:url]];
UIImage *image = [[UIImage alloc]initWithData:data];
if(image == nil){

}else{
[self performSelectorOnMainThread:@selector(updateUI:) withObject:image waitUntilDone:YES];
}
}

-(void)updateUI:(UIImage*) image{
self.imageView.image = image;
}


- (void)viewDidLoad
{
[super viewDidLoad];

// [NSThread detachNewThreadSelector:@selector(downloadImage:) toTarget:self withObject:kURL];
NSThread *thread = [[NSThread alloc]initWithTarget:self selector:@selector(downloadImage:) object:kURL];
[thread start];
}

- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

@end